Compare commits
33 Commits
feature/au
...
092b91825f
Author | SHA1 | Date | |
---|---|---|---|
092b91825f | |||
52271811ad | |||
fb1237f111 | |||
bae4e13137 | |||
b752454233 | |||
196fb02436 | |||
9be993d9ba | |||
20dd880a11 | |||
946c3091c0 | |||
4bacd1a28d | |||
086789aa88 | |||
3c5b447d4c | |||
cfbb876d2c | |||
4e0bfef483 | |||
ccdb49c8ea | |||
90dd281f7c | |||
d9df6e67a8 | |||
cd20e730ba | |||
c613d15e89 | |||
2380398fa9 | |||
4c5b9c7648 | |||
91a3f3171d | |||
01f7dad37c | |||
2bfdf5c172 | |||
15f6a30cd6 | |||
812c921a42 | |||
dafe7eee34 | |||
4e366d94c9 | |||
773390b09f | |||
ac0121d96e | |||
a0c4f2cad3 | |||
66bd9f648b | |||
485eb7b886 |
10
Readme.md
10
Readme.md
@@ -22,7 +22,7 @@ Right now it depends on the following non-core Python 3 libraries. These can be
|
||||
* [django-widget-tweaks](https://github.com/jazzband/django-widget-tweaks) Tweak the form field rendering in templates, not in python-level form definitions.
|
||||
* [django-taggit](https://github.com/jazzband/django-taggit) A simpler approach to tagging with Django.
|
||||
|
||||
### Bundled Dependencies
|
||||
### Bundled Dependencies
|
||||
We also leverage some other great OpenSource projects' code. We bundle those in the distribution to obsolete the need to pull those files from monitored CDNs.
|
||||
|
||||
* [OpenLayers](https://openlayers.org/) [6.4.3] OpenLayers makes it easy to put a dynamic map in any web page. It can display map tiles, vector data and markers loaded from any source.
|
||||
@@ -88,7 +88,9 @@ Run `django_lostplaces/managy.py collectstatic` and you should be ready to go.
|
||||
|
||||
If you haven't already setup a django instance, see [django's documentation](https://docs.djangoproject.com/en/3.1/topics/install/).
|
||||
|
||||
After that, download the desired release (probably the latest one) [from the releases page](https://git.mowoe.com/reverend/lostplaces-backend/releases) and install it using `pip install --user name-of-the-file.tar.gz`
|
||||
Afterwards, either
|
||||
- download the desired release [from the releases page](https://git.mowoe.com/reverend/lostplaces-backend/releases) and install it using `pip install --user name-of-the-file.tar.gz`
|
||||
- or install the latest release using `pip install django-lostplaces`
|
||||
|
||||
*Note: You can run pip install without the --user flag, which will require root privileges and introduces potential security issues.*
|
||||
|
||||
@@ -144,3 +146,7 @@ Before making the django instance public, you should tweak the config `settings.
|
||||
|
||||
|
||||
Run `django_lostplaces/manage.py collectstatic` you should be ready to go.
|
||||
|
||||
|
||||
### Contact
|
||||
If you run into any issues, have any questions or If you are interested in this project in general, feel free to get in touch with us via [reverend@reverend2048.de](mailto:reverend@reverend2048.de), we do speak English and German.
|
@@ -1,3 +1,4 @@
|
||||
exclude
|
||||
include LICENSE
|
||||
include Readme.rst
|
||||
include Pipfile
|
11
django_lostplaces/lostplaces/common.py
Normal file
11
django_lostplaces/lostplaces/common.py
Normal file
@@ -0,0 +1,11 @@
|
||||
def get_all_subclasses(cls):
|
||||
'''
|
||||
Gets all subclasses recursively, does not contain
|
||||
abstract classes
|
||||
'''
|
||||
subclass_list = []
|
||||
for subclass in cls.__subclasses__():
|
||||
if not subclass._meta.abstract:
|
||||
subclass_list.append(subclass)
|
||||
subclass_list += get_all_subclasses(subclass)
|
||||
return subclass_list
|
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-10-11 07:48+0200\n"
|
||||
"POT-Creation-Date: 2020-10-11 21:53+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Commander1024 <commander@commander1024.de>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -50,6 +50,22 @@ msgstr "Längengrad"
|
||||
msgid "Longitude in decimal format: e. g. 2.17403"
|
||||
msgstr "Breitengrad in dezimaler Form: z. B. 7.4840155"
|
||||
|
||||
#: models/abstract_models.py:59
|
||||
msgid "Submission date"
|
||||
msgstr "Einreichungsdatum"
|
||||
|
||||
#: models/abstract_models.py:67
|
||||
msgid "Submitter"
|
||||
msgstr "Einreicher"
|
||||
|
||||
#: models/abstract_models.py:79
|
||||
msgid "Creation date"
|
||||
msgstr "Erstellungsdatum"
|
||||
|
||||
#: models/abstract_models.py:82
|
||||
msgid "Expiration date"
|
||||
msgstr "Ablaufdatum"
|
||||
|
||||
#: models/external_links.py:13
|
||||
msgid "URL"
|
||||
msgstr "Adresse (URL)"
|
||||
@@ -96,7 +112,7 @@ msgstr "Zurück"
|
||||
|
||||
#: templates/global.html:32
|
||||
msgid "Logout"
|
||||
msgstr "Abmelden"
|
||||
msgstr "Ausloggen"
|
||||
|
||||
#: templates/global.html:34
|
||||
msgid "Admin"
|
||||
@@ -108,8 +124,8 @@ msgid "Login"
|
||||
msgstr "Anmelden"
|
||||
|
||||
#: templates/global.html:40 templates/registration/login.html:29
|
||||
#: templates/signup.html:12 templates/signup.html:41
|
||||
msgid "Sign Up"
|
||||
#: templates/signup.html:6 templates/signup.html:12 templates/signup.html:41
|
||||
msgid "Sign up"
|
||||
msgstr "Registrieren"
|
||||
|
||||
#: templates/global.html:50 templates/home.html:10
|
||||
@@ -122,11 +138,11 @@ msgstr "UrBex Codex"
|
||||
|
||||
#: templates/global.html:56 templates/place/place_create.html:5
|
||||
#: templates/place/place_create.html:10
|
||||
msgid "Create Place"
|
||||
msgid "Create place"
|
||||
msgstr "Place erstellen"
|
||||
|
||||
#: templates/global.html:57
|
||||
msgid "All Places"
|
||||
msgid "All places"
|
||||
msgstr "Alle Places"
|
||||
|
||||
#: templates/home.html:20 templates/home_unauth.html:20
|
||||
@@ -247,7 +263,8 @@ msgid "Submit a photo album"
|
||||
msgstr "Fotoalbum hinzufügen"
|
||||
|
||||
#: templates/photo_album/photo_album_create.html:8
|
||||
#: templates/place/place_detail.html:18
|
||||
#: templates/place/place_detail.html:18 templates/place/place_update.html:5
|
||||
#: templates/place/place_update.html:10
|
||||
msgid "Edit place"
|
||||
msgstr "Place bearbeiten"
|
||||
|
||||
@@ -265,12 +282,13 @@ msgid "Create"
|
||||
msgstr "Erstellen"
|
||||
|
||||
#: templates/place/place_delete.html:5
|
||||
msgid "Lost Place Deletion"
|
||||
msgid "Delete lost place"
|
||||
msgstr "Lost Place löschen"
|
||||
|
||||
#: templates/place/place_delete.html:15
|
||||
msgid "Are you sure you want to delete"
|
||||
msgstr "Willst Du den Ort wirklich löschen: "
|
||||
#, python-format
|
||||
msgid "Are you sure you want to delete %(place_name)s?"
|
||||
msgstr "Bist Du sicher, dass Du %(place_name)s löschen möchtest?"
|
||||
|
||||
#: templates/place/place_delete.html:19
|
||||
msgid "Delete"
|
||||
@@ -293,17 +311,13 @@ msgid "Images"
|
||||
msgstr "Bilder"
|
||||
|
||||
#: templates/place/place_list.html:10
|
||||
msgid "Lost Places"
|
||||
msgid "All Places"
|
||||
msgstr "Alle Places"
|
||||
|
||||
#: templates/place/place_list.html:16
|
||||
msgid "Listing our places"
|
||||
msgid "Our lost places"
|
||||
msgstr "Unsere Lost Places"
|
||||
|
||||
#: templates/place/place_update.html:5 templates/place/place_update.html:10
|
||||
msgid "Update place"
|
||||
msgstr "Place bearbeiten"
|
||||
|
||||
#: templates/place/place_update.html:42
|
||||
msgid "Update"
|
||||
msgstr "Aktualisieren"
|
||||
@@ -313,13 +327,9 @@ msgid "Submit images to a place"
|
||||
msgstr "Bilder zu einem Place hinzufügen"
|
||||
|
||||
#: templates/registration/login.html:29
|
||||
msgid "Have No Account Yet?"
|
||||
msgid "No account, yet?"
|
||||
msgstr "Noch kein Konto?"
|
||||
|
||||
#: templates/signup.html:6
|
||||
msgid "Sign up"
|
||||
msgstr "Registrieren"
|
||||
|
||||
#: views/base_views.py:25
|
||||
msgid "Please login to proceed"
|
||||
msgstr "Bitte log Dich ein um fortzufahren"
|
||||
@@ -329,49 +339,49 @@ msgid "Image(s) submitted successfully"
|
||||
msgstr "Bild(er) erfolgreich hinzugefügt"
|
||||
|
||||
#: views/place_image_views.py:41
|
||||
msgid "Image(s) deleted successfully"
|
||||
msgstr "Bild(er) erfolgreich gelöscht"
|
||||
msgid "Image deleted successfully"
|
||||
msgstr "Bild erfolgreich gelöscht"
|
||||
|
||||
#: views/place_image_views.py:42
|
||||
msgid "You are not allowed to delete this image"
|
||||
msgstr "Du darfst dieses Bild nicht löschen"
|
||||
|
||||
#: views/place_views.py:62
|
||||
#, fuzzy
|
||||
#| msgid "Successfully deleted place"
|
||||
msgid "Successfully updated place"
|
||||
msgstr "Place erfolgreich gelöscht"
|
||||
msgstr "Place erfolgreich aktualisiert"
|
||||
|
||||
#: views/place_views.py:63
|
||||
msgid "You do no have permissions to alter this place"
|
||||
msgstr "Du hast nicht die Berechtigung, diesen Place zu bearbeiten"
|
||||
msgid "You are not allowed to edit this place"
|
||||
msgstr "Du darfst diesen Place nicht bearbeiten"
|
||||
|
||||
#: views/place_views.py:97
|
||||
#, fuzzy
|
||||
#| msgid "Successfully deleted place"
|
||||
msgid "Successfully created place"
|
||||
msgstr "Place erfolgreich gelöscht"
|
||||
msgstr "Place erfolgreich erstellt"
|
||||
|
||||
#: views/place_views.py:105
|
||||
msgid "Please fill in all required fields."
|
||||
msgstr "Bitte füll alle benötigten Felder aus."
|
||||
|
||||
#: views/place_views.py:112
|
||||
msgid "Successfully deleted place"
|
||||
msgstr "Place erfolgreich gelöscht"
|
||||
|
||||
#: views/place_views.py:114
|
||||
msgid "You do no have permission to delete this place"
|
||||
msgstr "Du hast nicht die Berechtigung, diesen Place zu löschen"
|
||||
msgid "You are not allowed to delete this place"
|
||||
msgstr "Du darfst diesen Place nicht löschen"
|
||||
|
||||
#: views/views.py:29
|
||||
msgid "User created"
|
||||
msgstr "User erstellt"
|
||||
msgstr "Benutzer erstellt"
|
||||
|
||||
#: views/views.py:54
|
||||
msgid "Photo Album submitted"
|
||||
msgstr "Fotoalbum hinzugefügt"
|
||||
msgid "Photo album link submitted"
|
||||
msgstr "Fotoalbum-Link hinzugefügt"
|
||||
|
||||
#: views/views.py:59
|
||||
msgid "Photo Album deleted"
|
||||
msgstr "Fotoalbum gelöscht"
|
||||
msgid "Photo album link deleted"
|
||||
msgstr "Fotoalbum-Link gelöscht"
|
||||
|
||||
#: views/views.py:60
|
||||
msgid "You do not have permissions to alter this photo album"
|
||||
msgstr "Du hast nicht die Berechtigung, diesen Place zu bearbeiten"
|
||||
msgid "You are not allowed to edit this photo album link"
|
||||
msgstr "Du darfst diesen Fotoalbum-Link nicht bearbeiten"
|
||||
|
@@ -19,4 +19,4 @@ class Migration(migrations.Migration):
|
||||
migrations.DeleteModel(
|
||||
name='Expireable'
|
||||
)
|
||||
]
|
||||
]
|
@@ -6,7 +6,7 @@ from django.db import migrations, models
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('lostplaces', '0002_remove_vouchers'),
|
||||
('lostplaces', '0002_reomve_vouchers'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
@@ -22,4 +22,4 @@ class Migration(migrations.Migration):
|
||||
'abstract': False,
|
||||
},
|
||||
),
|
||||
]
|
||||
]
|
102
django_lostplaces/lostplaces/migrations/0004_release_0_1_3.py
Normal file
102
django_lostplaces/lostplaces/migrations/0004_release_0_1_3.py
Normal file
@@ -0,0 +1,102 @@
|
||||
# Generated by Django 3.1.1 on 2020-12-19 13:53
|
||||
|
||||
import django.core.validators
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import easy_thumbnails.fields
|
||||
import lostplaces.models.place
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('lostplaces', '0003_voucher'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='photoalbum',
|
||||
name='label',
|
||||
field=models.CharField(max_length=100, verbose_name='link text'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='photoalbum',
|
||||
name='submitted_by',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='photoalbums', to='lostplaces.explorer', verbose_name='Submitter'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='photoalbum',
|
||||
name='submitted_when',
|
||||
field=models.DateTimeField(auto_now_add=True, null=True, verbose_name='Submission date'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='photoalbum',
|
||||
name='url',
|
||||
field=models.URLField(verbose_name='URL'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='place',
|
||||
name='description',
|
||||
field=models.TextField(help_text="Description of the place: e.g. how to get there, where to be careful, the place's history...", verbose_name='Description'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='place',
|
||||
name='latitude',
|
||||
field=models.FloatField(help_text='Latitude in decimal format: e. g. 41.40338', validators=[django.core.validators.MinValueValidator(-90), django.core.validators.MaxValueValidator(90)], verbose_name='Latitude'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='place',
|
||||
name='location',
|
||||
field=models.CharField(max_length=50, verbose_name='Location'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='place',
|
||||
name='longitude',
|
||||
field=models.FloatField(help_text='Longitude in decimal format: e. g. 2.17403', validators=[django.core.validators.MinValueValidator(-180), django.core.validators.MaxValueValidator(180)], verbose_name='Longitude'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='place',
|
||||
name='name',
|
||||
field=models.CharField(max_length=50, verbose_name='Name'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='place',
|
||||
name='submitted_by',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='places', to='lostplaces.explorer', verbose_name='Submitter'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='place',
|
||||
name='submitted_when',
|
||||
field=models.DateTimeField(auto_now_add=True, null=True, verbose_name='Submission date'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='placeimage',
|
||||
name='description',
|
||||
field=models.TextField(blank=True, verbose_name='Description'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='placeimage',
|
||||
name='filename',
|
||||
field=easy_thumbnails.fields.ThumbnailerImageField(help_text='Optional: One or more images to upload', upload_to=lostplaces.models.place.generate_image_upload_path, verbose_name='Filename(s)'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='placeimage',
|
||||
name='submitted_by',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='placeimages', to='lostplaces.explorer', verbose_name='Submitter'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='placeimage',
|
||||
name='submitted_when',
|
||||
field=models.DateTimeField(auto_now_add=True, null=True, verbose_name='Submission date'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='voucher',
|
||||
name='created_when',
|
||||
field=models.DateTimeField(auto_now_add=True, verbose_name='Creation date'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='voucher',
|
||||
name='expires_when',
|
||||
field=models.DateTimeField(verbose_name='Expiration date'),
|
||||
),
|
||||
]
|
@@ -53,13 +53,18 @@ class Submittable(models.Model):
|
||||
class Meta:
|
||||
abstract = True
|
||||
|
||||
submitted_when = models.DateTimeField(auto_now_add=True, null=True)
|
||||
submitted_when = models.DateTimeField(
|
||||
auto_now_add=True,
|
||||
null=True,
|
||||
verbose_name=_('Submission date')
|
||||
)
|
||||
submitted_by = models.ForeignKey(
|
||||
'Explorer',
|
||||
on_delete=models.SET_NULL,
|
||||
null=True,
|
||||
blank=True,
|
||||
related_name='%(class)ss'
|
||||
related_name='%(class)ss',
|
||||
verbose_name=_('Submitter')
|
||||
)
|
||||
|
||||
class Expireable(models.Model):
|
||||
@@ -69,8 +74,13 @@ class Expireable(models.Model):
|
||||
class Meta:
|
||||
abstract = True
|
||||
|
||||
created_when = models.DateTimeField(auto_now_add=True)
|
||||
expires_when = models.DateTimeField()
|
||||
created_when = models.DateTimeField(
|
||||
auto_now_add=True,
|
||||
verbose_name=_('Creation date')
|
||||
)
|
||||
expires_when = models.DateTimeField(
|
||||
verbose_name=_('Expiration date')
|
||||
)
|
||||
|
||||
@property
|
||||
def is_expired(self):
|
||||
|
@@ -72,7 +72,7 @@ class PlaceAsset(Submittable):
|
||||
null=True
|
||||
)
|
||||
|
||||
class PlaceImage (Submittable):
|
||||
class PlaceImage (PlaceAsset):
|
||||
"""
|
||||
PlaceImage defines an image file object that points to a file in uploads/.
|
||||
Intermediate image sizes are generated as defined in THUMBNAIL_ALIASES.
|
||||
@@ -138,4 +138,4 @@ def auto_delete_file_on_change(sender, instance, **kwargs):
|
||||
new_file = instance.filename
|
||||
if not old_file == new_file:
|
||||
if os.path.isfile(old_file.path):
|
||||
os.remove(old_file.path)
|
||||
os.remove(old_file.path)
|
||||
|
BIN
django_lostplaces/lostplaces/static/images/missing_image.png
Normal file
BIN
django_lostplaces/lostplaces/static/images/missing_image.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 24 KiB |
@@ -862,10 +862,9 @@ body {
|
||||
margin: 0 3px; }
|
||||
|
||||
.LP-PlaceTeaser {
|
||||
width: 280px; }
|
||||
width: 100%; }
|
||||
.LP-PlaceTeaser .LP-PlaceTeaser__Image {
|
||||
height: 165px;
|
||||
width: 280px;
|
||||
width: 100%;
|
||||
overflow: hidden; }
|
||||
.LP-PlaceTeaser .LP-PlaceTeaser__Image .LP-Image {
|
||||
max-width: unset;
|
||||
@@ -873,6 +872,8 @@ body {
|
||||
object-fit: cover; }
|
||||
.LP-PlaceTeaser .LP-PlaceTeaser__Meta {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 10px;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 5px;
|
||||
@@ -883,19 +884,30 @@ body {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
margin-top: 5px;
|
||||
font-size: 0.9rem; }
|
||||
font-size: 1.3rem; }
|
||||
.LP-PlaceTeaser .LP-PlaceTeaser__Meta .LP-Headline {
|
||||
font-family: "Montserrat", Helvetica, sans-serif;
|
||||
color: #565656;
|
||||
font-size: 1rem;
|
||||
font-size: 2rem;
|
||||
padding: 0px;
|
||||
margin: 0px; }
|
||||
.LP-PlaceTeaser .LP-PlaceTeaser__Meta .LP-Icon {
|
||||
height: 2em;
|
||||
width: 2em; }
|
||||
.LP-PlaceTeaser .LP-PlaceTeaser__Description {
|
||||
font-family: "Montserrat", Helvetica, sans-serif;
|
||||
color: #565656;
|
||||
display: none; }
|
||||
order: 3;
|
||||
flex-basis: 100%; }
|
||||
.LP-PlaceTeaser .LP-PlaceTeaser__Description .LP-Paragraph {
|
||||
font-size: 22px; }
|
||||
|
||||
@media (min-width: 650px) {
|
||||
.LP-PlaceTeaser {
|
||||
width: 280px; }
|
||||
.LP-PlaceTeaser__Image {
|
||||
width: 280px;
|
||||
height: 165px; }
|
||||
.LP-PlaceTeaser--extended {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
@@ -904,12 +916,15 @@ body {
|
||||
height: 165px; }
|
||||
.LP-PlaceTeaser--extended .LP-PlaceTeaser__Meta {
|
||||
margin: 0;
|
||||
padding: 5px;
|
||||
padding-left: 25px;
|
||||
display: flex;
|
||||
flex-wrap: nowrap;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
align-items: flex-start; }
|
||||
align-items: flex-start;
|
||||
gap: unset; }
|
||||
.LP-PlaceTeaser--extended .LP-PlaceTeaser__Meta .LP-Headline, .LP-PlaceTeaser--extended .LP-PlaceTeaser__Meta .LP-Paragraph {
|
||||
font-size: unset; }
|
||||
.LP-PlaceTeaser--extended .LP-PlaceTeaser__Meta .LP-PlaceTeaser__Info .LP-Headline {
|
||||
font-size: 28px; }
|
||||
.LP-PlaceTeaser--extended .LP-PlaceTeaser__Meta .LP-PlaceTeaser__Icons {
|
||||
@@ -917,10 +932,16 @@ body {
|
||||
.LP-PlaceTeaser--extended .LP-PlaceTeaser__Meta .LP-PlaceTeaser__Icons ul {
|
||||
padding: 0;
|
||||
margin: 0; }
|
||||
.LP-PlaceTeaser--extended .LP-PlaceTeaser__Meta .LP-Icon {
|
||||
height: 20px;
|
||||
width: 20px; }
|
||||
.LP-PlaceTeaser--extended .LP-PlaceTeaser__Description {
|
||||
display: block;
|
||||
max-height: 55px;
|
||||
overflow: hidden; }
|
||||
overflow: hidden;
|
||||
order: unset; }
|
||||
.LP-PlaceTeaser--extended .LP-PlaceTeaser__Description .LP-Paragraph {
|
||||
font-size: unset; }
|
||||
.LP-PlaceTeaser--extended .LP-PlaceTeaser__Image {
|
||||
height: 165px;
|
||||
width: 280px;
|
||||
@@ -1006,6 +1027,31 @@ body {
|
||||
.LP-MessageList .LP-MessageList__Item {
|
||||
margin: 5px 0; }
|
||||
|
||||
.LP-UserInfo {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
background-color: #D7CEC7;
|
||||
max-width: 400px;
|
||||
width: 100%;
|
||||
min-width: 300px; }
|
||||
.LP-UserInfo__UserName {
|
||||
background-color: #C09F80; }
|
||||
.LP-UserInfo__UserName .LP-Headline {
|
||||
color: black;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
text-align: center;
|
||||
padding: 5px;
|
||||
font-size: 25px; }
|
||||
.LP-UserInfo__Meta {
|
||||
padding: 5px; }
|
||||
.LP-UserInfo__Meta * {
|
||||
font-family: "Montserrat", Helvetica, sans-serif;
|
||||
font-size: 18px; }
|
||||
.LP-UserInfo__Meta .LP-UserInfo__Key {
|
||||
padding-right: 25px;
|
||||
font-weight: bold; }
|
||||
|
||||
.LP-Header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -1069,7 +1115,9 @@ body {
|
||||
box-shadow: 0 0 2px #565656; }
|
||||
|
||||
.LP-PlaceList .LP-PlaceList__List {
|
||||
list-style-type: none; }
|
||||
list-style-type: none;
|
||||
padding: 0;
|
||||
margin: 0; }
|
||||
.LP-PlaceList .LP-PlaceList__List .LP-Link .LP-Place:hover {
|
||||
color: #565656;
|
||||
background-color: #f9f9f9;
|
||||
@@ -1080,6 +1128,10 @@ body {
|
||||
.LP-PlaceList .LP-PlaceList__List .LP-PlaceList__Item {
|
||||
max-width: 900px;
|
||||
margin: 18px 0; }
|
||||
@media (max-width: 750px) {
|
||||
.LP-PlaceList .LP-PlaceList__List .LP-PlaceList__Item {
|
||||
width: 100%;
|
||||
margin-bottom: 35px; } }
|
||||
|
||||
.LP-PlaceList .LP-Pagination {
|
||||
margin-top: 50px; }
|
||||
@@ -1661,6 +1713,18 @@ body {
|
||||
padding: .5em;
|
||||
border-radius: 2px; }
|
||||
|
||||
.LP-UserProfile {
|
||||
display: flex;
|
||||
flex-direction: row; }
|
||||
.LP-UserProfile__Bio {
|
||||
flex-grow: 5;
|
||||
flex-shrink: 10;
|
||||
padding-right: 35px; }
|
||||
.LP-UserProfile__Info {
|
||||
flex-grow: 10;
|
||||
flex-shrink: 1;
|
||||
flex-basis: max-content; }
|
||||
|
||||
.LP-MainContainer {
|
||||
margin: 0 auto;
|
||||
max-width: 1280px; }
|
||||
@@ -1673,8 +1737,9 @@ body {
|
||||
width: 100%; } }
|
||||
|
||||
.LP-PlaceDetail .LP-PlaceDetail__Image {
|
||||
width: 700px;
|
||||
max-width: 700px;
|
||||
max-height: 500px;
|
||||
width: 50%;
|
||||
box-shadow: 0 0 10px #565656;
|
||||
box-shadow: 0 0 10px #565656;
|
||||
object-fit: cover;
|
||||
@@ -1682,15 +1747,16 @@ body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
float: right;
|
||||
margin-left: 35px;
|
||||
margin-bottom: 35px;
|
||||
margin-right: 35px;
|
||||
margin-left: 25px;
|
||||
margin-bottom: 25px;
|
||||
margin-right: 25px;
|
||||
overflow: hidden; }
|
||||
|
||||
@media (max-width: 1000px) {
|
||||
@media (max-width: 750px) {
|
||||
.LP-PlaceDetail .LP-PlaceDetail__Header .LP-PlaceDetail__Image {
|
||||
float: none;
|
||||
width: 100%;
|
||||
max-width: unset;
|
||||
height: auto;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
|
@@ -1,7 +1,7 @@
|
||||
{% extends 'global.html'%}
|
||||
{% load i18n %}
|
||||
|
||||
{% block title %}{% trans 'Forbidden' %}{% endblock %}
|
||||
{% block title %}{% translate 'Forbidden' %}{% endblock %}
|
||||
|
||||
{% block additional_head %}
|
||||
{% if request.META.HTTP_REFERER %}
|
||||
@@ -11,6 +11,6 @@
|
||||
|
||||
{% block maincontent %}
|
||||
{% if request.META.HTTP_REFERER %}
|
||||
<p class="LP-Headline">{% trans 'You will be redirected in 5 seconds' %}</p><p class="LP-Headline"><a href="{{ request.META.HTTP_REFERER }}" class="LP-Link">{% trans 'Go Back' %}</a></p>
|
||||
<p class="LP-Headline">{% translate 'You will be redirected in 5 seconds' %}</p><p class="LP-Headline"><a href="{{ request.META.HTTP_REFERER }}" class="LP-Link">{% translate 'Go Back' %}</a></p>
|
||||
{% endif %}
|
||||
{% endblock maincontent %}
|
92
django_lostplaces/lostplaces/templates/explorer/profile.html
Normal file
92
django_lostplaces/lostplaces/templates/explorer/profile.html
Normal file
@@ -0,0 +1,92 @@
|
||||
{% extends 'global.html'%}
|
||||
{% load static %}
|
||||
{% load i18n %}
|
||||
|
||||
{% load svg_icon %}
|
||||
|
||||
{% block maincontent %}
|
||||
|
||||
<div class="LP-UserProfile">
|
||||
<div class="LP-UserProfile__Info">
|
||||
<div class="LP-UserInfo">
|
||||
<div class="LP-UserInfo__UserName">
|
||||
<h1 class="LP-Headline">{{explorer.user.username}}</h1>
|
||||
</div>
|
||||
<div class="LP-UserInfo__Meta">
|
||||
<table>
|
||||
<tr>
|
||||
<td class="LP-UserInfo__Key">
|
||||
<span class="LP-Paragraph">{% translate 'Joined' %}</span>
|
||||
</td>
|
||||
<td class="LP-UserInfo__Value">
|
||||
<span class="LP-Paragraph">{{explorer.user.date_joined|date:'d.m.Y'}}</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="LP-UserInfo__Key">
|
||||
<span class="LP-Paragraph">{% translate 'Places'%}</span>
|
||||
</td>
|
||||
<td class="LP-UserInfo__Value">
|
||||
<span class="LP-Paragraph">{{place_count}}</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="LP-UserInfo__Key">
|
||||
<span class="LP-Paragraph">{% translate 'Place Assets'%}</span>
|
||||
</td>
|
||||
<td class="LP-UserInfo__Value">
|
||||
<span class="LP-Paragraph">{{asset_count}}</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<section class="LP-Section">
|
||||
<div class="LP-PlaceList">
|
||||
<h1 class="LP-Headline">{% translate 'Places submitted by' %} {{explorer.user.username}}</h1>
|
||||
<ul class="LP-PlaceList__List">
|
||||
{% for place in place_list %}
|
||||
<li class="LP-PlaceList__Item">
|
||||
<a href="{% url 'place_detail' pk=place.pk %}" class="LP-Link">
|
||||
{% include 'partials/place_teaser.html' with place=place extended=True %}
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
{% include 'partials/nav/pagination.html' %}
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="LP-Section">
|
||||
{% translate 'Images submitted by' as submitted_by %}
|
||||
{% include 'partials/placeImageGrid.html' with headline=submitted_by|add:' '|add:explorer.user.username image_list=assets.placeimages.all%}
|
||||
</section>
|
||||
|
||||
<section class=" LP-Section">
|
||||
<h1 class="LP-Headline">{% translate 'Photo albums submitted by' %} {{explorer.user.username}}</h1>
|
||||
<div class="LP-LinkList">
|
||||
<ul class="LP-LinkList__Container">
|
||||
{% for photo_album in assets.photoalbums.all %}
|
||||
<li class="LP-LinkList__Item">
|
||||
<a target="_blank" href="{{photo_album.url}}" class="LP-Link">
|
||||
<span class="LP-Text">{{photo_album.label}}</span>
|
||||
</a>
|
||||
{% if user.explorer == photo_album.submitted_by%}
|
||||
<a href="{% url 'photo_album_delete' pk=photo_album.pk%}" class="LP-Link LP-LinkList__ItemHover" title="Delete Photo Album">
|
||||
<div class="RV-Iconized__Container RV-Iconized__Container--small">
|
||||
{% icon 'trash' className="RV-Iconized__Icon" %}
|
||||
</div>
|
||||
</a>
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{% endblock maincontent %}
|
@@ -29,15 +29,16 @@
|
||||
<span class="LP-Paragraph">
|
||||
{% if user.is_authenticated %}
|
||||
Hi {{ user.username }}!
|
||||
<a class="LP-Link" href="{% url 'logout' %}"><span class="LP-Link__Text">{% trans 'Logout' %}</span></a>
|
||||
<a class="LP-Link" href="{% url 'logout' %}"><span class="LP-Link__Text">{% translate 'Logout' %}</span></a> |
|
||||
<a class="LP-Link" href="{% url 'explorer_profile' explorer_id=user.pk%}"><span class="LP-Link__Text">{% translate 'Profile' %}</span></a>
|
||||
{% if user.is_superuser %}
|
||||
<a class="LP-Link" href="{% url 'admin:index' %}" target="_blank"><span class="LP-Link__Text">{% trans 'Admin' %}</span></a>
|
||||
| <a class="LP-Link" href="{% url 'admin:index' %}" target="_blank"><span class="LP-Link__Text">{% translate 'Admin' %}</span></a>
|
||||
{% endif %}
|
||||
|
||||
{% else %}
|
||||
You are not logged in.
|
||||
<a class="LP-Link" href="{% url 'login' %}"><span class="LP-Link__Text">{% trans 'Login' %}</span></a> |
|
||||
<a class="LP-Link" href="{% url 'signup' %}"><span class="LP-Link__Text">{% trans 'Sign Up' %}</span></a>
|
||||
<a class="LP-Link" href="{% url 'login' %}"><span class="LP-Link__Text">{% translate 'Login' %}</span></a> |
|
||||
<a class="LP-Link" href="{% url 'signup' %}"><span class="LP-Link__Text">{% translate 'Sign up' %}</span></a>
|
||||
{% endif %}
|
||||
</span>
|
||||
</div>
|
||||
@@ -47,14 +48,14 @@
|
||||
<aside class="LP-Main__Sidebar">
|
||||
<nav class="LP-Menu LP-Menu--sidebar">
|
||||
<ul class="LP-Menu__List">
|
||||
<li class="LP-Menu__Item"><a href="{% url 'lostplaces_home' %}" class="LP-Link"><span class="LP-Link__Text">{% trans 'Home' %}</span></a></li>
|
||||
<li class="LP-Menu__Item"><a href="{% url 'flatpage' slug='codex' %}" class="LP-Link"><span class="LP-Link__Text">{% trans 'UrBex Codex' %}</span></a></li>
|
||||
<li class="LP-Menu__Item"><a href="{% url 'lostplaces_home' %}" class="LP-Link"><span class="LP-Link__Text">{% translate 'Home' %}</span></a></li>
|
||||
<li class="LP-Menu__Item"><a href="{% url 'flatpage' slug='codex' %}" class="LP-Link"><span class="LP-Link__Text">{% translate 'UrBex Codex' %}</span></a></li>
|
||||
|
||||
{% block additional_menu_items %}
|
||||
{% endblock additional_menu_items %}
|
||||
|
||||
<li class="LP-Menu__Item LP-Menu__Item--additional"><a href="{% url 'place_create'%}" class="LP-Link"><span class="LP-Link__Text">{% trans 'Create Place' %}</span></a></li>
|
||||
<li class="LP-Menu__Item LP-Menu__Item--additional"><a href="{% url 'place_list'%}" class="LP-Link"><span class="LP-Link__Text">{% trans 'All Places' %}</span></a></li>
|
||||
<li class="LP-Menu__Item LP-Menu__Item--additional"><a href="{% url 'place_create'%}" class="LP-Link"><span class="LP-Link__Text">{% translate 'Create place' %}</span></a></li>
|
||||
<li class="LP-Menu__Item LP-Menu__Item--additional"><a href="{% url 'place_list'%}" class="LP-Link"><span class="LP-Link__Text">{% translate 'All places' %}</span></a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</aside>
|
||||
|
@@ -7,7 +7,7 @@
|
||||
<script src="{% static 'maps/ol.js' %}"></script>
|
||||
{% endblock additional_head %}
|
||||
|
||||
# {% block title %}{% trans 'Home' %}{% endblock %}
|
||||
# {% block title %}{% translate 'Home' %}{% endblock %}
|
||||
|
||||
{% block maincontent %}
|
||||
|
||||
@@ -17,33 +17,12 @@
|
||||
|
||||
{% include 'partials/osm_map.html' with config=mapping_config %}
|
||||
<div class="LP-PlaceGrid">
|
||||
<h1 class="LP-Headline LP-Headline">{% trans 'Explore the latest places' %}</h1>
|
||||
<h1 class="LP-Headline LP-Headline">{% translate 'Explore the latest places' %}</h1>
|
||||
<ul class="LP-PlaceGrid__Grid">
|
||||
{% for place in place_list %}
|
||||
<li class="LP-PlaceGrid__Item">
|
||||
<a href="{% url 'place_detail' pk=place.pk %}" class="LP-Link">
|
||||
<article class="LP-PlaceTeaser">
|
||||
<div class="LP-PlaceTeaser__Image">
|
||||
<img class="LP-Image" src="{{ place.placeimages.first.filename.thumbnail.url}}" />
|
||||
</div>
|
||||
<div class="LP-PlaceTeaser__Meta">
|
||||
<div class="LP-PlaceTeaser__Info">
|
||||
<span class="LP-PlaceTeaser__Title">
|
||||
<h1 class="LP-Headline LP-Headline--teaser">{{place.name|truncatechars:19}}</h1>
|
||||
</span>
|
||||
<span class="LP-PlaceTeaser__Detail">
|
||||
<p class="LP-Paragraph">{{place.location|truncatechars:25}}</p>
|
||||
</span>
|
||||
</div>
|
||||
<div class="LP-PlaceTeaser__Icons">
|
||||
<ul class="LP-Icon__List">
|
||||
<li class="LP-Icon__Item"><img class="LP-Icon" src="{% static '/icons/favourite.svg' %}" /></li>
|
||||
<li class="LP-Icon__Item"><img class="LP-Icon" src="{% static '/icons/location.svg' %}" /></li>
|
||||
<li class="LP-Icon__Item"><img class="LP-Icon" src="{% static '/icons/flag.svg' %}" /></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
{% include 'partials/place_teaser.html' with place=place%}
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
|
@@ -8,23 +8,23 @@
|
||||
{% include 'partials/welcome.html' %}
|
||||
<article class="LP-TextSection">
|
||||
<p class="LP-Paragraph">
|
||||
{% blocktrans %}You can create, view and share your lost places with other members of this site. You can upload photos, place links to your web galleries and contribute your knowledge by tagging other places or commenting on them. You will find detailed information on where these locations are, how to get there and what to expect from them. This might even include detailed information on the surroundings or the history of a lost place.{% endblocktrans %}
|
||||
{% blocktranslate %}You can create, view and share your lost places with other members of this site. You can upload photos, place links to your web galleries and contribute your knowledge by tagging other places or commenting on them. You will find detailed information on where these locations are, how to get there and what to expect from them. This might even include detailed information on the surroundings or the history of a lost place.{% endblocktranslate %}
|
||||
</p>
|
||||
{% url 'signup' as signup_url %}
|
||||
<p class="LP-Paragraph">
|
||||
{% blocktrans %}Since vandalism is a growing problem these days, no sensitive information is available to the public. You have to <a class="LP-Link" href="{{signup_url}}"><span class="LP-Link__Text">sign up</span></a> with a voucher code as an invitation to join this community. Only admins can create these codes. Usually you are given a code when we know you in real life in person and when we trust you. A request from an unknown person will most probably be denied.{% endblocktrans %}
|
||||
{% blocktranslate %}Since vandalism is a growing problem these days, no sensitive information is available to the public. You have to <a class="LP-Link" href="{{signup_url}}"><span class="LP-Link__Text">sign up</span></a> with a voucher code as an invitation to join this community. Only admins can create these codes. Usually you are given a code when we know you in real life in person and when we trust you. A request from an unknown person will most probably be denied.{% endblocktranslate %}
|
||||
</p>
|
||||
</article>
|
||||
|
||||
<div class="LP-PlaceGrid">
|
||||
<h1 class="LP-Headline LP-Headline">{% trans 'Explore the latest places' %}</h1>
|
||||
<h1 class="LP-Headline LP-Headline">{% translate 'Explore the latest places' %}</h1>
|
||||
<ul class="LP-PlaceGrid__Grid">
|
||||
{% for place in place_list %}
|
||||
<li class="LP-PlaceGrid__Item">
|
||||
<a href="{% url 'place_detail' pk=place.pk %}" class="LP-Link">
|
||||
<article class="LP-PlaceTeaser">
|
||||
<div class="LP-PlaceTeaser__Image">
|
||||
<img class="LP-Image" src="{{ place.placeimages.first.filename.thumbnail.url}}" />
|
||||
{% include 'partials/image.html' with source_url=place.placeimages.first.filename.thumbnail.url %}
|
||||
</div>
|
||||
<div class="LP-PlaceTeaser__Meta">
|
||||
<div class="LP-PlaceTeaser__Info">
|
||||
|
@@ -1,9 +1,9 @@
|
||||
{% load i18n %}
|
||||
<div class="LP-Form__Field LP-Form__Button LP-Input">
|
||||
<button class="LP-Button">{% if action %}{{ action }}{% else %}{% trans 'Submit' %}{% endif %}</button>
|
||||
<button class="LP-Button">{% if action %}{{ action }}{% else %}{% translate 'Submit' %}{% endif %}</button>
|
||||
</div>
|
||||
<div class="LP-Form__Field LP-Form__Button LP-Input">
|
||||
<a class="LP-Link" href="{% if referer %}{{ referer }}{% else %}{% url 'lostplaces_home' %}{% endif %}">
|
||||
<button type="button" class="LP-Button LP-Button--cancel">{% trans 'Cancel' %}</button>
|
||||
<button type="button" class="LP-Button LP-Button--cancel">{% translate 'Cancel' %}</button>
|
||||
</a>
|
||||
</div>
|
||||
|
18
django_lostplaces/lostplaces/templates/partials/image.html
Normal file
18
django_lostplaces/lostplaces/templates/partials/image.html
Normal file
@@ -0,0 +1,18 @@
|
||||
{% if link_url %}
|
||||
<a
|
||||
class="LP-Link"
|
||||
href="{{link_url}}"
|
||||
>
|
||||
{% endif %}
|
||||
<figure class="LP-Figure">
|
||||
<img
|
||||
src="{{ source_url }}"
|
||||
{% if alt_text %}
|
||||
alt="{{alt_text}}"
|
||||
{% else %}
|
||||
alt="{{block}}"
|
||||
{% endif %}
|
||||
class="LP-Image"
|
||||
/>
|
||||
</figure>
|
||||
{% if link_url %}</a>{% endif %}
|
@@ -61,13 +61,13 @@
|
||||
<!-- Bottom section with last line of text and links. -->
|
||||
<section class="LP-Footer__BottomSection LP-Footer__Flex">
|
||||
<div class="LP-Footer__BottomWrapper">
|
||||
{% trans 'Made by' %} <a href="https://git.mowoe.com/reverend" class="LP-Footer__GenericAnchor">Reverend</a>
|
||||
{% trans 'and' %} <a href="https://www.commander1024.de" class="LP-Footer__GenericAnchor">Commander1024.</a></span>
|
||||
{% translate 'Made by' %} <a href="https://git.mowoe.com/reverend" class="LP-Footer__GenericAnchor">Reverend</a>
|
||||
{% translate 'and' %} <a href="https://www.commander1024.de" class="LP-Footer__GenericAnchor">Commander1024.</a></span>
|
||||
</div>
|
||||
<div class="LP-Footer__BottomWrapper">
|
||||
<a href="{% url 'flatpage' slug='privacy-policy' %}" class="LP-Footer__GenericAnchor">{% trans 'Privacy Policy' %}</a>
|
||||
<a href="{% url 'flatpage' slug='privacy-policy' %}" class="LP-Footer__GenericAnchor">{% translate 'Privacy Policy' %}</a>
|
||||
|
|
||||
<a href="{% url 'flatpage' slug='imprint' %}" class="LP-Footer__GenericAnchor">{% trans 'Imprint' %}</a>
|
||||
<a href="{% url 'flatpage' slug='imprint' %}" class="LP-Footer__GenericAnchor">{% translate 'Imprint' %}</a>
|
||||
</div>
|
||||
</section>
|
||||
</footer>
|
||||
|
@@ -8,26 +8,26 @@
|
||||
<li class="LP-Pagination__Item LP-Pagination__Item--other LP-Pagination__Item--first">
|
||||
<a href="?page=1" class="LP-Link">
|
||||
<span class="LP-Icon">⟪</span>
|
||||
<span class="LP-Text">{% trans 'First' %}</span>
|
||||
<span class="LP-Text">{% translate 'First' %}</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="LP-Pagination__Item LP-Pagination__Item--other LP-Pagination__Item--previous">
|
||||
<a href="?page={{ page_obj.previous_page_number }}" class="LP-Link">
|
||||
<span class="LP-Icon">⟨</span>
|
||||
<span class="LP-Text">{% trans 'Previous' %}</span>
|
||||
<span class="LP-Text">{% translate 'Previous' %}</span>
|
||||
</a>
|
||||
</li>
|
||||
{% else %}
|
||||
<li class="LP-Pagination__Item LP-Pagination__Item--other LP-Pagination__Item--first LP-Pagination__Item--disabled">
|
||||
<a href="#" class="LP-Link">
|
||||
<span class="LP-Icon">⟪</span>
|
||||
<span class="LP-Text">{% trans 'First' %}</span>
|
||||
<span class="LP-Text">{% translate 'First' %}</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="LP-Pagination__Item LP-Pagination__Item--other LP-Pagination__Item--previous LP-Pagination__Item--disabled">
|
||||
<a href="#" class="LP-Link">
|
||||
<span class="LP-Icon">⟨</span>
|
||||
<span class="LP-Text">{% trans 'Previous' %}</span>
|
||||
<span class="LP-Text">{% translate 'Previous' %}</span>
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
@@ -47,25 +47,25 @@
|
||||
{% if page_obj.has_next %}
|
||||
<li class="LP-Pagination__Item LP-Pagination__Item--other LP-Pagination__Item--next">
|
||||
<a href="?page={{ page_obj.next_page_number }}" class="LP-Link">
|
||||
<span class="LP-Text">{% trans 'Next' %}</span>
|
||||
<span class="LP-Text">{% translate 'Next' %}</span>
|
||||
<span class="LP-Icon">⟩</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="LP-Pagination__Item LP-Pagination__Item--other LP-Pagination__Item--last">
|
||||
<a href="?page={{ page_obj.paginator.num_pages }}" class="LP-Link">
|
||||
<span class="LP-Text">{% trans 'Last' %}</span>
|
||||
<span class="LP-Text">{% translate 'Last' %}</span>
|
||||
<span class="LP-Icon">⟫</span>
|
||||
</a>
|
||||
</li>
|
||||
{% else %}
|
||||
<li class="LP-Pagination__Item LP-Pagination__Item--other LP-Pagination__Item--next LP-Pagination__Item--disabled">
|
||||
<a href="#" class="LP-Link">
|
||||
<span class="LP-Text">{% trans 'Next' %}</span>
|
||||
<span class="LP-Text">{% translate 'Next' %}</span>
|
||||
<span class="LP-Icon">⟩</span>
|
||||
</a>
|
||||
<li class="LP-Pagination__Item LP-Pagination__Item--other LP-Pagination__Item--last LP-Pagination__Item--disabled">
|
||||
<a href="#" class="LP-Link">
|
||||
<span class="LP-Text">{% trans 'Last' %}</span>
|
||||
<span class="LP-Text">{% translate 'Last' %}</span>
|
||||
<span class="LP-Icon">⟫</span>
|
||||
</a>
|
||||
</li>
|
||||
|
@@ -0,0 +1,21 @@
|
||||
{% load static %}
|
||||
|
||||
{% if headline %}
|
||||
<h1 class="LP-Headline">{{headline}}</h1>
|
||||
{% endif %}
|
||||
<div class="LP-ImageGrid">
|
||||
<ul class="LP-ImageGrid__Container">
|
||||
{% for image in image_list %}
|
||||
<li class="LP-ImageGrid__Item">
|
||||
{% include 'partials/image.html' with source_url=image.filename.thumbnail.url link_url=image.filename.large.url %}
|
||||
{% if user.explorer == image.submitted_by%}
|
||||
<span class="LP-ImageGrid__DeleteItem" title="Bild löschen">
|
||||
<a href="{% url 'place_image_delete' pk=image.id %}" class="LP-Link">
|
||||
<img class="LP-Icon" src="{% static 'icons/cancel.svg' %}" />
|
||||
</a>
|
||||
</span>
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
@@ -0,0 +1,37 @@
|
||||
{%load static %}
|
||||
|
||||
<article class="LP-PlaceTeaser {% if extended %} LP-PlaceTeaser--extended{% endif %}">
|
||||
<div class="LP-PlaceTeaser__Image">
|
||||
{% if place.placeimages.all|length > 0 %}
|
||||
{% include 'partials/image.html' with source_url=place.placeimages.first.filename.thumbnail.url %}
|
||||
{% else %}
|
||||
<img class="LP-Image" src="{% static 'images/missing_image.png' %}" />
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="LP-PlaceTeaser__Meta">
|
||||
<div class="LP-PlaceTeaser__Info">
|
||||
<span class="LP-PlaceTeaser__Title">
|
||||
<h1 class="LP-Headline LP-Headline--teaser">{{place.name|truncatechars:19}}</h1>
|
||||
</span>
|
||||
<span class="LP-PlaceTeaser__Detail">
|
||||
<p class="LP-Paragraph">{{place.location|truncatechars:25}}</p>
|
||||
</span>
|
||||
</div>
|
||||
<div class="LP-PlaceTeaser__Description">
|
||||
<p class="LP-Paragraph">
|
||||
{% if place.description|length > 210 %}
|
||||
{{place.description|truncatechars:210|truncatewords:-1}}
|
||||
{% else %}
|
||||
{{place.description}}
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
<div class="LP-PlaceTeaser__Icons">
|
||||
<ul class="LP-Icon__List">
|
||||
<li class="LP-Icon__Item"><img class="LP-Icon" src="{% static '/icons/favourite.svg' %}" /></li>
|
||||
<li class="LP-Icon__Item"><img class="LP-Icon" src="{% static '/icons/location.svg' %}" /></li>
|
||||
<li class="LP-Icon__Item"><img class="LP-Icon" src="{% static '/icons/flag.svg' %}" /></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
@@ -27,11 +27,11 @@
|
||||
|
||||
<form id="id_tag_submit_form" class="LP-Form LP-Form--inline LP-Form--tagging" method="POST" action="{% url config.submit_url_name tagged_id=config.tagged_item.id%}">
|
||||
<fieldset class="LP-Form__Fieldset">
|
||||
<legend class="LP-Form__Legend">{% trans 'Add tags' %}</legend>
|
||||
<legend class="LP-Form__Legend">{% translate 'Add tags' %}</legend>
|
||||
{% csrf_token %}
|
||||
<div class="LP-Form__Composition LP-Form__Composition--breakable">
|
||||
<div class="LP-Form__Field LP-Form__Button LP-Input LP-Input--tagging">
|
||||
<button id="id_tag_submit_button" class="LP-Button">{% trans 'Add tags' %}</button>
|
||||
<button id="id_tag_submit_button" class="LP-Button">{% translate 'Add tags' %}</button>
|
||||
</div>
|
||||
<div class="LP-Form__Field">
|
||||
{% include 'partials/form/inputField.html' with field=config.submit_form.tag_list classes="LP-Input--tagging" %}
|
||||
|
@@ -1,21 +1,21 @@
|
||||
{% load i18n %}
|
||||
|
||||
<header class="LP-TextSection__Headline">
|
||||
<h1 class="LP-Headline">{% trans 'Start' %}</h1>
|
||||
<h1 class="LP-Headline">{% translate 'Start' %}</h1>
|
||||
</header>
|
||||
|
||||
<div class="LP-TextSection__Text">
|
||||
<p class="LP-Paragraph">{% trans 'Welcome to our Urban Exploration community catalogue,' %}
|
||||
<p class="LP-Paragraph">{% translate 'Welcome to our Urban Exploration community catalogue,' %}
|
||||
{% if user.is_authenticated %}
|
||||
{{ user.username }}
|
||||
{% else %}
|
||||
{% trans 'explorer' %}
|
||||
{% translate 'explorer' %}
|
||||
{% endif %}
|
||||
!
|
||||
</p>
|
||||
<p class="LP-Paragraph">
|
||||
{% trans 'We strictly follow our' %}
|
||||
<a class="LP-Link" href="{% url 'flatpage' slug='codex' %}"><span class="LP-Link__Text">{% trans 'UrBex codex' %}</span></a>
|
||||
{% trans 'and expect you to do so, too.' %}'
|
||||
{% translate 'We strictly follow our' %}
|
||||
<a class="LP-Link" href="{% url 'flatpage' slug='codex' %}"><span class="LP-Link__Text">{% translate 'UrBex codex' %}</span></a>
|
||||
{% translate 'and expect you to do so, too.' %}'
|
||||
</p>
|
||||
</div>
|
||||
|
@@ -1,19 +1,19 @@
|
||||
{% extends 'global.html'%}
|
||||
{% load i18n %}
|
||||
|
||||
{% block title %}{% trans 'Submit a photo album' %}{% endblock %}
|
||||
{% block title %}{% translate 'Submit a photo album' %}{% endblock %}
|
||||
|
||||
{% block additional_menu_items %}
|
||||
<li class="LP-Menu__Item LP-Menu__Item--additional"><a href="{% url 'place_edit' pk=place.pk %}" class="LP-Link"><span
|
||||
class="LP-Link__Text">{% trans 'Edit place' %}</span></a></li>
|
||||
class="LP-Link__Text">{% translate 'Edit place' %}</span></a></li>
|
||||
<li class="LP-Menu__Item LP-Menu__Item--additional"><a href="{% url 'place_delete' pk=place.pk %}" class="LP-Link"><span
|
||||
class="LP-Link__Text">{% trans 'Delete place' %}</span></a></li>
|
||||
class="LP-Link__Text">{% translate 'Delete place' %}</span></a></li>
|
||||
{% endblock additional_menu_items %}
|
||||
|
||||
{% block maincontent %}
|
||||
<form class="LP-Form" method="POST">
|
||||
<fieldset class="LP-Form__Fieldset">
|
||||
<legend class="LP-Form__Legend">{% trans 'Submit a photo album for' %} {{place.name}}</legend>
|
||||
<legend class="LP-Form__Legend">{% translate 'Submit a photo album for' %} {{place.name}}</legend>
|
||||
{% csrf_token %}
|
||||
<div class="LP-Form__Composition">
|
||||
<div class="LP-Form__Field">
|
||||
|
@@ -2,12 +2,12 @@
|
||||
{% load static %}
|
||||
{% load i18n %}
|
||||
|
||||
# {% block title %}{% trans 'Create Place' %}{% endblock %}
|
||||
# {% block title %}{% translate 'Create place' %}{% endblock %}
|
||||
|
||||
{% block maincontent %}
|
||||
<form class="LP-Form" method="POST" enctype="multipart/form-data">
|
||||
<fieldset class="LP-Form__Fieldset">
|
||||
<legend class="LP-Form__Legend">{% trans 'Create Place' %}</legend>
|
||||
<legend class="LP-Form__Legend">{% translate 'Create place' %}</legend>
|
||||
{% csrf_token %}
|
||||
<div class="LP-Form__Composition LP-Form__Composition--breakable">
|
||||
<div class="LP-Form__Field">
|
||||
@@ -39,7 +39,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% trans 'Create' as action %}
|
||||
{% translate 'Create' as action %}
|
||||
<div class="LP-Form__Composition LP-Form__Composition--buttons">
|
||||
{% include 'partials/form/submit.html' with referrer=request.META.HTTP_REFERER action=action %}
|
||||
</div>
|
||||
|
@@ -2,21 +2,21 @@
|
||||
{% load static %}
|
||||
{% load i18n %}
|
||||
|
||||
{% block title %}{% trans 'Lost Place Deletion' %}{% endblock %}
|
||||
{% block title %}{% translate 'Delete lost place' %}{% endblock %}
|
||||
|
||||
{% block maincontent %}
|
||||
|
||||
<form class="LP-Form" method="POST">
|
||||
<fieldset class="LP-Form__Fieldset">
|
||||
<legend class="LP-Form__Legend">{% trans 'Delete place' %}</legend>
|
||||
<legend class="LP-Form__Legend">{% translate 'Delete place' %}</legend>
|
||||
{% csrf_token %}
|
||||
<div class="LP-Form__Composition">
|
||||
<div class="LP-Form__Field LP-Form__InfoText">
|
||||
<p class="LP-Paragraph">{% trans 'Are you sure you want to delete' %} "{{place.name}}"?</p>
|
||||
<p class="LP-Paragraph">{% blocktranslate with place_name=place.name%}Are you sure you want to delete {{place_name}}?{% endblocktranslate %}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% trans 'Delete' as action %}
|
||||
{% translate 'Delete' as action %}
|
||||
<div class="LP-Form__Composition LP-Form__Composition--buttons">
|
||||
{% include 'partials/form/submit.html' with referer=request.META.HTTP_REFERER action=action %}
|
||||
</div>
|
||||
|
@@ -4,6 +4,7 @@
|
||||
|
||||
{% load thumbnail %}
|
||||
{% load svg_icon %}
|
||||
{% load lostplaces %}
|
||||
|
||||
{% block additional_head %}
|
||||
<link rel="stylesheet" href="{% static 'maps/ol.css' %}" type="text/css">
|
||||
@@ -15,8 +16,8 @@
|
||||
{% block title %}{{place.name}}{% endblock %}
|
||||
|
||||
{% block additional_menu_items %}
|
||||
<li class="LP-Menu__Item LP-Menu__Item--additional"><a href="{% url 'place_edit' pk=place.pk %}" class="LP-Link"><span class="LP-Link__Text">{% trans 'Edit place' %}</span></a></li>
|
||||
<li class="LP-Menu__Item LP-Menu__Item--additional"><a href="{% url 'place_delete' pk=place.pk %}" class="LP-Link"><span class="LP-Link__Text">{% trans 'Delete place' %}</span></a></li>
|
||||
<li class="LP-Menu__Item LP-Menu__Item--additional"><a href="{% url 'place_edit' pk=place.pk %}" class="LP-Link"><span class="LP-Link__Text">{% translate 'Edit place' %}</span></a></li>
|
||||
<li class="LP-Menu__Item LP-Menu__Item--additional"><a href="{% url 'place_delete' pk=place.pk %}" class="LP-Link"><span class="LP-Link__Text">{% translate 'Delete place' %}</span></a></li>
|
||||
{% endblock additional_menu_items %}
|
||||
|
||||
{% block maincontent %}
|
||||
@@ -25,9 +26,11 @@
|
||||
<header class="LP-PlaceDetail__Header">
|
||||
<h1 class="LP-Headline">{{ place.name }}</h1>
|
||||
{% if place.placeimages.first.filename.hero.url %}
|
||||
<figure class="LP-PlaceDetail__Image">
|
||||
<img src="{{ place.placeimages.first.filename.hero.url }}" class="LP-Image" />
|
||||
</figure>
|
||||
<div class="LP-PlaceDetail__Image">
|
||||
{% partial image %}
|
||||
{% set source_url place.placeimages.first.filename.hero.url %}
|
||||
{% endpartial %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</header>
|
||||
|
||||
@@ -38,13 +41,15 @@
|
||||
<section class="LP-Section">
|
||||
|
||||
{% url 'place_tag_submit' place_id=place.id as tag_submit_url%}
|
||||
{% include 'partials/tagging.html' with config=tagging_config %}
|
||||
{% partial tagging %}
|
||||
{% set config=tagging_config %}
|
||||
{% endpartial %}
|
||||
|
||||
</section>
|
||||
|
||||
<section class="LP-Section">
|
||||
<h1 class="LP-Headline">{% trans 'Map links' %}</h1>
|
||||
{% include 'partials/osm_map.html' with config=mapping_config%}
|
||||
<h1 class="LP-Headline">{% translate 'Map links' %}</h1>
|
||||
{% partial osm_map config=mapping_config %}
|
||||
<div class="LP-LinkList">
|
||||
<ul class="LP-LinkList__Container">
|
||||
<li class="LP-LinkList__Item"><a target="_blank" href="https://www.google.com/maps?q={{place.latitude|safe}},{{place.longitude|safe}}" class="LP-Link"><span class="LP-Text">Google Maps</span></a></li>
|
||||
@@ -55,7 +60,7 @@
|
||||
</section>
|
||||
|
||||
<section class=" LP-Section">
|
||||
<h1 class="LP-Headline">{% trans 'Photo albums' %}</h1>
|
||||
<h1 class="LP-Headline">{% translate 'Photo albums' %}</h1>
|
||||
<div class="LP-LinkList">
|
||||
<ul class="LP-LinkList__Container">
|
||||
{% for photo_album in place.photoalbums.all %}
|
||||
@@ -81,7 +86,7 @@
|
||||
v216c0,11.046,8.954,20,20,20s20-8.954,20-20V276h216c11.046,0,20-8.954,20-20C512,244.954,503.046,236,492,236z" />
|
||||
</g>
|
||||
</svg>
|
||||
<span class="RV-Iconized__Text">{% trans 'Add photo album' %}</span>
|
||||
<span class="RV-Iconized__Text">{% translate 'Add photo album' %}</span>
|
||||
</div>
|
||||
</a>
|
||||
</li>
|
||||
@@ -90,30 +95,8 @@
|
||||
</section>
|
||||
|
||||
<section class="LP-Section">
|
||||
<h1 class="LP-Headline">{% trans 'Images' %}</h1>
|
||||
<div class="LP-ImageGrid">
|
||||
<ul class="LP-ImageGrid__Container">
|
||||
{% for place_image in place.placeimages.all %}
|
||||
<li class="LP-ImageGrid__Item">
|
||||
<a href="{{ place_image.filename.large.url }}" class="LP-Link">
|
||||
<img class="LP-Image" src="{{ place_image.filename.thumbnail.url }}">
|
||||
</a>
|
||||
{% if user.explorer == place_image.submitted_by or user.explorer == place.submitted_by %}
|
||||
<span class="LP-ImageGrid__DeleteItem" title="Bild löschen">
|
||||
<a href="{% url 'place_image_delete' pk=place_image.id %}" class="LP-Link">
|
||||
<img class="LP-Icon" src="{% static 'icons/cancel.svg' %}" />
|
||||
</a>
|
||||
</span>
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
<li class="LP-ImageGrid__Item LP-ImageGrid__Item--add" title="Bild hinzufügen">
|
||||
<a class="LP-Link" href="{% url 'place_image_create' place_id=place.id%}">
|
||||
<img class="LP-Icon" src="{% static 'icons/plus.svg' %}" />
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
{% translate 'Images' as headline %}
|
||||
{% partial "placeImageGrid" image_list=place.placeimages.all %}
|
||||
</section>
|
||||
|
||||
</article>
|
||||
|
@@ -7,48 +7,18 @@
|
||||
<script src="{% static 'maps/ol.js' %}"></script>
|
||||
{% endblock additional_head %}
|
||||
|
||||
{% block title %}{% trans 'Lost Places' %}{% endblock %}
|
||||
{% block title %}{% translate 'All Places' %}{% endblock %}
|
||||
|
||||
{% block maincontent %}
|
||||
|
||||
{% include 'partials/osm_map.html' with config=mapping_config %}
|
||||
<div class="LP-PlaceList">
|
||||
<h1 class="LP-Headline">{% trans 'Listing our places' %}</h1>
|
||||
<h1 class="LP-Headline">{% translate 'Our lost places' %}</h1>
|
||||
<ul class="LP-PlaceList__List">
|
||||
{% for place in place_list %}
|
||||
<li class="LP-PlaceList__Item">
|
||||
<a href="{% url 'place_detail' pk=place.pk %}" class="LP-Link">
|
||||
<article class="LP-PlaceTeaser LP-PlaceTeaser--extended">
|
||||
<div class="LP-PlaceTeaser__Image">
|
||||
<img class="LP-Image" src="{{ place.placeimages.first.filename.thumbnail.url }}" />
|
||||
</div>
|
||||
<div class="LP-PlaceTeaser__Meta">
|
||||
<div class="LP-PlaceTeaser__Info">
|
||||
<span class="LP-PlaceTeaser__Title">
|
||||
<h2 class="LP-Headline LP-Headline--teaser">{{place.name}}</h2>
|
||||
</span>
|
||||
<span class="LP-PlaceTeaser__Detail">
|
||||
<p class="LP-Paragraph">{{place.location}}</p>
|
||||
</span>
|
||||
</div>
|
||||
<div class="LP-PlaceTeaser__Description">
|
||||
<p class="LP-Paragraph">
|
||||
{% if place.description|length > 210 %}
|
||||
{{place.description|truncatechars:210|truncatewords:-1}}
|
||||
{% else %}
|
||||
{{place.description}}
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
<div class="LP-PlaceTeaser__Icons">
|
||||
<ul class="LP-Icon__List">
|
||||
<li class="LP-Icon__Item"><img class="LP-Icon" src="{% static '/icons/favourite.svg' %}" /></li>
|
||||
<li class="LP-Icon__Item"><img class="LP-Icon" src="{% static '/icons/location.svg' %}" /></li>
|
||||
<li class="LP-Icon__Item"><img class="LP-Icon" src="{% static '/icons/flag.svg' %}" /></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
{% include 'partials/place_teaser.html' with place=place extended=True %}
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
|
@@ -2,12 +2,12 @@
|
||||
{% load static %}
|
||||
{% load i18n %}
|
||||
|
||||
# {% block title %}{% trans 'Update place' %}{% endblock %}
|
||||
# {% block title %}{% translate 'Edit place' %}{% endblock %}
|
||||
|
||||
{% block maincontent %}
|
||||
<form class="LP-Form" method="POST" enctype="multipart/form-data">
|
||||
<fieldset class="LP-Form__Fieldset">
|
||||
<legend class="LP-Form__Legend">{% trans 'Update place' %}</legend>
|
||||
<legend class="LP-Form__Legend">{% translate 'Edit place' %}</legend>
|
||||
{% csrf_token %}
|
||||
<div class="LP-Form__Composition LP-Form__Composition--breakable">
|
||||
<div class="LP-Form__Field">
|
||||
@@ -39,7 +39,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% trans 'Update' as action %}
|
||||
{% translate 'Update' as action %}
|
||||
<div class="LP-Form__Composition LP-Form__Composition--buttons">
|
||||
{% include 'partials/form/submit.html' with referrer=request.META.HTTP_REFERER action=action %}
|
||||
</div>
|
||||
|
@@ -4,7 +4,7 @@
|
||||
{% block maincontent %}
|
||||
<form class="LP-Form" method="POST" enctype="multipart/form-data">
|
||||
<fieldset class="LP-Form__Fieldset">
|
||||
<legend class="LP-Form__Legend">{% trans 'Submit images to a place' %}</legend>
|
||||
<legend class="LP-Form__Legend">{% translate 'Submit images to a place' %}</legend>
|
||||
{% csrf_token %}
|
||||
|
||||
<div class="LP-Form__Composition">
|
||||
|
@@ -1,13 +1,13 @@
|
||||
{% extends 'global.html'%}
|
||||
{% load static %}
|
||||
{% load i18n %}
|
||||
# {% block title %}{% trans 'Login' %}{% endblock %}
|
||||
# {% block title %}{% translate 'Login' %}{% endblock %}
|
||||
|
||||
{% block maincontent %}
|
||||
|
||||
<form class="LP-Form" method="POST" enctype="multipart/form-data">
|
||||
<fieldset class="LP-Form__Fieldset">
|
||||
<legend class="LP-Form__Legend">{% trans 'Login' %}</legend>
|
||||
<legend class="LP-Form__Legend">{% translate 'Login' %}</legend>
|
||||
{% csrf_token %}
|
||||
<div class="LP-Form__Composition LP-Form__Composition--breakable">
|
||||
<div class="LP-Form__Field">
|
||||
@@ -20,12 +20,12 @@
|
||||
|
||||
<div class="LP-Form__Composition LP-Form__Composition--buttons">
|
||||
<div class="LP-Form__Field LP-Form__Button LP-Input">
|
||||
<button class="LP-Button">{% trans 'Login' %}</button>
|
||||
<button class="LP-Button">{% translate 'Login' %}</button>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</form>
|
||||
|
||||
<p class="LP-Headline">{% trans 'Have No Account Yet?' %} <a class="LP-Link" href="{% url 'signup' %}"><span class="LP-Link__Text">{% trans 'Sign Up' %}</span></a></p>
|
||||
<p class="LP-Headline">{% translate 'No account, yet?' %} <a class="LP-Link" href="{% url 'signup' %}"><span class="LP-Link__Text">{% translate 'Sign up' %}</span></a></p>
|
||||
|
||||
{% endblock maincontent %}
|
@@ -3,13 +3,13 @@
|
||||
{% load i18n %}
|
||||
{% load widget_tweaks %}
|
||||
|
||||
# {% block title %}{% trans 'Sign up' %}{% endblock %}
|
||||
# {% block title %}{% translate 'Sign up' %}{% endblock %}
|
||||
|
||||
{% block maincontent %}
|
||||
|
||||
<form class="LP-Form" method="POST">
|
||||
<fieldset class="LP-Form__Fieldset">
|
||||
<legend class="LP-Form__Legend">{% trans 'Sign Up' %}</legend>
|
||||
<legend class="LP-Form__Legend">{% translate 'Sign up' %}</legend>
|
||||
{% csrf_token %}
|
||||
<div class="LP-Form__Composition LP-Form__Composition--breakable">
|
||||
<div class="LP-Form__Field">
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
<div class="LP-Form__Composition LP-Form__Composition--buttons">
|
||||
<div class="LP-Form__Field LP-Form__Button LP-Input">
|
||||
<button class="LP-Button">{% trans 'Sign Up' %}</button>
|
||||
<button class="LP-Button">{% translate 'Sign up' %}</button>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
@@ -6,6 +6,15 @@ from django.http import request
|
||||
|
||||
register = template.Library()
|
||||
|
||||
def remove_formatting(string):
|
||||
for to_strip in ["'", '"', ' ']:
|
||||
string = string.strip(to_strip)
|
||||
|
||||
for to_remove in ['\t', '\n',]:
|
||||
string = string.replace(to_remove, '')
|
||||
|
||||
return string
|
||||
|
||||
@register.filter(name='proper_paginate')
|
||||
def proper_paginate(paginator, current_page, neighbors=2):
|
||||
if paginator.num_pages > 2*neighbors:
|
||||
@@ -25,11 +34,80 @@ def proper_paginate(paginator, current_page, neighbors=2):
|
||||
return page_list[:(2*neighbors + 1)]
|
||||
return paginator.page_range
|
||||
|
||||
@register.simple_tag
|
||||
def can_modify_place_asset(place_asset):
|
||||
if request.user.is_superuser:
|
||||
return True
|
||||
if request.user == ( place_asset.place.submitted_by or place_asset.submitted_by):
|
||||
return True
|
||||
|
||||
class VariableNode(template.Node):
|
||||
def __init__(self, name, content=None):
|
||||
if content==None and '=' in name:
|
||||
self.content = name.split('=')[1]
|
||||
self.name = name.split('=')[0]
|
||||
else:
|
||||
self.content = content
|
||||
self.name = name
|
||||
|
||||
def render(self, context):
|
||||
if type(self.content) is not str:
|
||||
self.content = self.content.render(context)
|
||||
|
||||
self.content = remove_formatting(self.content)
|
||||
|
||||
self.content = template.Variable(self.content).resolve(context)
|
||||
|
||||
context[self.name] = self.content
|
||||
return ''
|
||||
|
||||
class PartialNode(template.Node):
|
||||
def __init__(self, name, block):
|
||||
self.name = remove_formatting(name)
|
||||
self.block = block
|
||||
|
||||
def render(self, context):
|
||||
if type(self.block) is template.NodeList:
|
||||
self.block = self.block.render(context)
|
||||
|
||||
self.block = remove_formatting(self.block)
|
||||
|
||||
context = context.flatten()
|
||||
context['block'] = self.block
|
||||
t = template.loader.get_template('partials/%s.html' % self.name)
|
||||
return t.render(context)
|
||||
|
||||
@register.tag(name='set')
|
||||
def set_block(parser, token):
|
||||
split = token.split_contents()
|
||||
if len(split) >= 1:
|
||||
variable_name = split[1]
|
||||
else:
|
||||
return False
|
||||
raise template.TemplateSyntaxError('%r expects a variable name' % split[0])
|
||||
|
||||
if len(split) == 2:
|
||||
content=None
|
||||
if '=' not in variable_name:
|
||||
content = parser.parse(('end%s'%split[0],))
|
||||
parser.delete_first_token()
|
||||
return VariableNode(variable_name, content)
|
||||
else:
|
||||
return VariableNode(variable_name, split[2])
|
||||
|
||||
@register.tag(name='partial')
|
||||
def partial(parser, token):
|
||||
split = token.split_contents()
|
||||
if len(split) >= 1:
|
||||
partial_name = split[1]
|
||||
else:
|
||||
raise template.TemplateSyntaxError('%r expects a partial name' % split[0])
|
||||
|
||||
if len(split) == 2:
|
||||
nodeList = parser.parse(('end%s'%split[0],))
|
||||
parser.delete_first_token()
|
||||
return PartialNode(partial_name, nodeList)
|
||||
else:
|
||||
nodeList = template.NodeList()
|
||||
for parameter in split[2:]:
|
||||
if '=' in parameter:
|
||||
nodeList.append(
|
||||
VariableNode(name=parameter)
|
||||
)
|
||||
else:
|
||||
raise template.TemplateSyntaxError('%r expects kwargs, got args' % split[0])
|
||||
return PartialNode(partial_name, nodeList)
|
||||
|
@@ -15,7 +15,8 @@ from lostplaces.views import (
|
||||
PhotoAlbumDeleteView,
|
||||
PlaceImageCreateView,
|
||||
PlaceImageDeleteView,
|
||||
FlatView
|
||||
FlatView,
|
||||
ExplorerProfileView
|
||||
)
|
||||
|
||||
urlpatterns = [
|
||||
@@ -33,5 +34,7 @@ urlpatterns = [
|
||||
|
||||
# POST-only URLs for tag submission
|
||||
path('place/tag/<int:tagged_id>', PlaceTagSubmitView.as_view(), name='place_tag_submit'),
|
||||
path('place/tag/delete/<int:tagged_id>/<int:tag_id>', PlaceTagDeleteView.as_view(), name='place_tag_delete')
|
||||
path('place/tag/delete/<int:tagged_id>/<int:tag_id>', PlaceTagDeleteView.as_view(), name='place_tag_delete'),
|
||||
|
||||
path('explorer/<int:explorer_id>/', ExplorerProfileView.as_view(), name='explorer_profile')
|
||||
]
|
||||
|
@@ -4,4 +4,5 @@
|
||||
from lostplaces.views.base_views import *
|
||||
from lostplaces.views.views import *
|
||||
from lostplaces.views.place_views import *
|
||||
from lostplaces.views.place_image_views import *
|
||||
from lostplaces.views.place_image_views import *
|
||||
from lostplaces.views.explorer_views import *
|
45
django_lostplaces/lostplaces/views/explorer_views.py
Normal file
45
django_lostplaces/lostplaces/views/explorer_views.py
Normal file
@@ -0,0 +1,45 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from django.views import View
|
||||
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from django.shortcuts import render, redirect, get_object_or_404
|
||||
from django.urls import reverse_lazy
|
||||
|
||||
from lostplaces.common import get_all_subclasses
|
||||
from lostplaces.views.base_views import IsAuthenticatedMixin
|
||||
from lostplaces.models.models import Explorer
|
||||
from lostplaces.models.place import Place, PlaceAsset
|
||||
|
||||
class ExplorerProfileView(IsAuthenticatedMixin, View):
|
||||
def get(self, request, explorer_id):
|
||||
explorer = get_object_or_404(Explorer, pk=explorer_id)
|
||||
place_list = Place.objects.filter(submitted_by=explorer)
|
||||
place_count = place_list.count()
|
||||
|
||||
context={
|
||||
'explorer': explorer,
|
||||
'place_count': place_count,
|
||||
'place_list': place_list,
|
||||
'assets': {}
|
||||
}
|
||||
|
||||
asset_count = 0
|
||||
for subclass in get_all_subclasses(PlaceAsset): # kinda ugly, but PlaceAsset cannot be abstract according to django ORM
|
||||
objects = subclass.objects.filter(submitted_by=explorer)
|
||||
context['assets'][subclass.__name__.lower()+'s'] = objects
|
||||
asset_count += objects.count()
|
||||
|
||||
context['asset_count'] = asset_count
|
||||
|
||||
print(context['assets'])
|
||||
|
||||
return render(
|
||||
request=request,
|
||||
template_name='explorer/profile.html',
|
||||
context=context
|
||||
)
|
||||
|
||||
|
@@ -38,5 +38,5 @@ class PlaceImageCreateView(MultiplePlaceImageUploadMixin, PlaceAssetCreateView):
|
||||
|
||||
class PlaceImageDeleteView(PlaceAssetDeleteView):
|
||||
model = PlaceImage
|
||||
success_message = _('Image(s) deleted successfully')
|
||||
success_message = _('Image deleted successfully')
|
||||
permission_denied_message = _('You are not allowed to delete this image')
|
||||
|
@@ -60,7 +60,7 @@ class PlaceUpdateView(IsAuthenticatedMixin, IsPlaceSubmitterMixin, SuccessMessag
|
||||
model = Place
|
||||
form_class = PlaceForm
|
||||
success_message = _('Successfully updated place')
|
||||
place_submitter_error_message = _('You do no have permissions to alter this place')
|
||||
place_submitter_error_message = _('You are not allowed to edit this place')
|
||||
|
||||
def get_success_url(self):
|
||||
return reverse_lazy('place_detail', kwargs={'pk':self.get_object().pk})
|
||||
@@ -102,7 +102,7 @@ class PlaceCreateView(MultiplePlaceImageUploadMixin, IsAuthenticatedMixin, View)
|
||||
# Usually the browser should have checked the form before sending.
|
||||
messages.error(
|
||||
self.request,
|
||||
'Please fill in all required fields.'
|
||||
_('Please fill in all required fields.')
|
||||
)
|
||||
return render(request, 'place/place_create.html', context={'form': place_form})
|
||||
|
||||
@@ -111,7 +111,7 @@ class PlaceDeleteView(IsAuthenticatedMixin, IsPlaceSubmitterMixin, DeleteView):
|
||||
model = Place
|
||||
success_message = _('Successfully deleted place')
|
||||
success_url = reverse_lazy('place_list')
|
||||
place_submitter_error_message = _('You do no have permission to delete this place')
|
||||
place_submitter_error_message = _('You are not allowed to delete this place')
|
||||
|
||||
def delete(self, request, *args, **kwargs):
|
||||
messages.success(self.request, self.success_message)
|
||||
|
@@ -51,13 +51,13 @@ class PhotoAlbumCreateView(PlaceAssetCreateView):
|
||||
model = PhotoAlbum
|
||||
fields = ['url', 'label']
|
||||
template_name = 'photo_album/photo_album_create.html'
|
||||
success_message = _('Photo Album submitted')
|
||||
success_message = _('Photo album link submitted')
|
||||
|
||||
class PhotoAlbumDeleteView(PlaceAssetDeleteView):
|
||||
model = PhotoAlbum
|
||||
pk_url_kwarg = 'pk'
|
||||
success_message = _('Photo Album deleted')
|
||||
permission_denied_messsage = _('You do not have permissions to alter this photo album')
|
||||
success_message = _('Photo album link deleted')
|
||||
permission_denied_messsage = _('You are not allowed to edit this photo album link')
|
||||
|
||||
class PlaceTagSubmitView(IsAuthenticatedMixin, View):
|
||||
def post(self, request, tagged_id, *args, **kwargs):
|
||||
|
@@ -1,8 +0,0 @@
|
||||
# Config options for coverage
|
||||
# Docs: https://coverage.readthedocs.io/en/latest/config.html
|
||||
|
||||
[coverage:run]
|
||||
source = .
|
||||
|
||||
[coverage:report]
|
||||
show_missing = True
|
11
setup.py → django_lostplaces/setup.py
Normal file → Executable file
11
setup.py → django_lostplaces/setup.py
Normal file → Executable file
@@ -1,19 +1,19 @@
|
||||
#!/usr/bin/env python
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from setuptools import setup, find_packages
|
||||
|
||||
with open('Readme.md') as f:
|
||||
with open('../Readme.md') as f:
|
||||
readme = f.read()
|
||||
|
||||
setup(
|
||||
name='django-lostplaces',
|
||||
version='0.1.2 HotFix',
|
||||
version='0.1.3',
|
||||
description='A django app to manage lost places',
|
||||
author='Reverend',
|
||||
author_email='reverend@reverend2048.de',
|
||||
url='https://git.mowoe.com/reverend/lostplaces-backend',
|
||||
packages=find_packages(exclude=['lostplaces']),
|
||||
packages=find_packages(exclude=['django_lostplaces']),
|
||||
long_description=readme,
|
||||
long_description_content_type='text/markdown',
|
||||
classifiers=[
|
||||
@@ -31,5 +31,6 @@ setup(
|
||||
'django-widget-tweaks',
|
||||
'django-taggit'
|
||||
],
|
||||
include_package_data=True
|
||||
include_package_data=True,
|
||||
license='MIT'
|
||||
)
|
Reference in New Issue
Block a user