diff --git a/campaigns/forms.py b/campaigns/forms.py index 1bbd720..aef2b77 100644 --- a/campaigns/forms.py +++ b/campaigns/forms.py @@ -1,5 +1,11 @@ from django import forms +from campaigns.models import Campaign -class CampaignForm(forms.Form): + +class CampaignForm(forms.ModelForm): name = forms.CharField(widget=forms.TextInput) + + class Meta: + model = Campaign + fields = ["name", "language"] diff --git a/campaigns/models.py b/campaigns/models.py index bf34204..2ec1a30 100644 --- a/campaigns/models.py +++ b/campaigns/models.py @@ -5,11 +5,12 @@ from django_tenants.models import DomainMixin from tenant_users.tenants.models import TenantBase from rpg_notes.secrets import DEBUG +from utils.languages import full_text_languages, full_text_languages_choice class Campaign(TenantBase): name = models.CharField(_("Name"), max_length=1000, unique=True) - language = models.CharField(_("Language"), max_length=100) + language = models.CharField(_("Language"), max_length=100, choices=full_text_languages_choice) auto_create_schema = True diff --git a/campaigns/templates/campaigns/campaign_detail.jinja b/campaigns/templates/campaigns/campaign_detail.jinja index 6e00150..e2a4fe8 100644 --- a/campaigns/templates/campaigns/campaign_detail.jinja +++ b/campaigns/templates/campaigns/campaign_detail.jinja @@ -3,11 +3,23 @@ {% block title %}{{ object }}{% endblock %} {% block content %} -

{{ object }}

-

{% trans %}Players{% endtrans %}

- + {% if not is_demo %} +

{{ object }}

+

{% trans %}Players{% endtrans %}

+ + {% else %} +

RPGnotes Demo

+

+ {% trans %}This is a read-only demo of RPGnotes.{% endtrans %} + {% trans %}If you would like to try it yourself, go back to the homepage and sign up.{% endtrans %} +

+ + {% trans %}Homepage{% endtrans %} + + + {% endif %} {% endblock %} diff --git a/campaigns/views.py b/campaigns/views.py index 966223f..7e5c0b5 100644 --- a/campaigns/views.py +++ b/campaigns/views.py @@ -8,6 +8,7 @@ from tenant_users.tenants.tasks import provision_tenant from campaigns.forms import CampaignForm from campaigns.models import Campaign +from common.middlewares import demo_campaign_id from users.models import TenantUser @@ -38,7 +39,7 @@ class CampaignCreateView(LoginRequiredMixin, generic.FormView): return redirect("http://" + fqdn) -class CampaignDetailView(LoginRequiredMixin, generic.DetailView): +class CampaignDetailView(generic.DetailView): template_name = "campaigns/campaign_detail.jinja" model = Campaign slug_url_kwarg = "campslug" @@ -48,19 +49,21 @@ class CampaignDetailView(LoginRequiredMixin, generic.DetailView): def get_context_data(self, **kwargs): context = super(CampaignDetailView, self).get_context_data(**kwargs) - players = self.get_object().user_set.exclude(pk__in=[1, 2]) + players = self.object.user_set.exclude(pk__in=[1, 2]) context["players"] = {} player: TenantUser for player in players: context["players"][player] = player.characters.all() + + context["is_demo"] = self.request.tenant.pk == demo_campaign_id return context class CampaignEditView(LoginRequiredMixin, generic.UpdateView): template_name = "campaigns/campaign_edit.jinja" model = Campaign - fields = ["name"] + form_class = CampaignForm slug_url_kwarg = "campslug" def get_object(self, queryset=None): diff --git a/common/middlewares.py b/common/middlewares.py index 29eefaf..ce5c6fa 100644 --- a/common/middlewares.py +++ b/common/middlewares.py @@ -1,10 +1,14 @@ from django.contrib.auth.views import redirect_to_login from django.core.exceptions import PermissionDenied from django.http import HttpRequest +from django.template.response import TemplateResponse from campaigns.models import Campaign +from rpg_notes.settings import DEBUG from users.models import TenantUser +demo_campaign_id = 4 if DEBUG else 8 + class AuthMiddleware: def __init__(self, get_response): @@ -19,6 +23,13 @@ class AuthMiddleware: or request.path.startswith("/login") \ or request.path.startswith("/css"): return self.get_response(request) + if tenant.pk == demo_campaign_id: + if request.method in {"GET", "HEAD"} or request.path.startswith("/i18n/setlang"): + return self.get_response(request) + elif not current_user.is_authenticated: + r = TemplateResponse(request, "common/demo_readonly.jinja") + r.render() + return r if not current_user.is_authenticated: return redirect_to_login(request.get_full_path()) if not current_user.tenants.filter(pk=tenant.pk).exists(): diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index ddbd393..418b7a5 100644 Binary files a/locale/de/LC_MESSAGES/django.mo and b/locale/de/LC_MESSAGES/django.mo differ diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index e218b4f..8fbdd23 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-19 14:37+0200\n" +"POT-Creation-Date: 2022-07-05 20:20+0200\n" "PO-Revision-Date: 2022-06-19 14:13+0200\n" "Last-Translator: Lukas Winkler \n" "Language-Team: \n" @@ -18,19 +18,35 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.1\n" -#: campaigns/models.py:11 common/models/nameslugmodel.py:8 loot/models.py:14 +#: campaigns/models.py:12 common/models/nameslugmodel.py:8 loot/models.py:14 #: users/models.py:10 msgid "Name" msgstr "Name" -#: campaigns/models.py:12 +#: campaigns/models.py:13 msgid "Language" msgstr "Sprache" -#: campaigns/templates/campaigns/campaign_detail.jinja:7 +#: campaigns/templates/campaigns/campaign_detail.jinja:8 msgid "Players" msgstr "Spieler" +#: campaigns/templates/campaigns/campaign_detail.jinja:17 +msgid "This is a read-only demo of RPGnotes." +msgstr "Dies ist eine nur lesbare Demo von RPGnotes." + +#: campaigns/templates/campaigns/campaign_detail.jinja:18 +msgid "" +"If you would like to try it yourself, go back to the homepage and sign up." +msgstr "" +"Falls du es selbst ausprobieren willst, gehe zurück zur Startseite und " +"registriere dich." + +#: campaigns/templates/campaigns/campaign_detail.jinja:21 +#: templates/common/demo_readonly.jinja:17 +msgid "Homepage" +msgstr "Startseite" + #: campaigns/templates/campaigns/campaign_edit.jinja:5 msgid "Add new campaign" msgstr "Neue Campagne erstellen" @@ -53,7 +69,7 @@ msgstr "Campaign erstellen" msgid "Nickname" msgstr "Spitzname" -#: characters/models.py:26 +#: characters/models.py:26 common/models/aliasmodel.py:9 msgid "Aliases" msgstr "Aliase" @@ -62,6 +78,7 @@ msgid "Subtitle" msgstr "Untertitel" #: characters/models.py:31 characters/templates/characters/detail.jinja:53 +#: common/models/draft.py:13 msgid "Player" msgstr "Spieler" @@ -70,11 +87,12 @@ msgid "If no player is selected, this character is considered an NPC." msgstr "Wenn kein Spieler ausgewählt ist, ist dies ein NPC." #: characters/models.py:37 characters/templates/characters/detail.jinja:57 -#: factions/models.py:17 +#: factions/models.py:11 msgid "Faction" msgstr "Fraktion" -#: characters/models.py:41 locations/models.py:26 loot/models.py:28 +#: characters/models.py:41 characters/templates/characters/detail.jinja:61 +#: locations/models.py:26 loot/models.py:28 #: loot/templates/loot/overview.jinja:17 msgid "Location" msgstr "Ort" @@ -123,15 +141,19 @@ msgstr "Bearbeiten" msgid "Also known as:" msgstr "Auch bekannt als:" -#: characters/templates/characters/detail.jinja:74 templates/macros.jinja:28 +#: characters/templates/characters/detail.jinja:79 templates/macros.jinja:28 msgid "Last updated" msgstr "Zuletzt geändert" -#: characters/templates/characters/detail.jinja:75 templates/macros.jinja:29 +#: characters/templates/characters/detail.jinja:80 templates/macros.jinja:29 msgid "by" msgstr "von" -#: common/models/descriptionmodel.py:8 +#: common/models/aliasmodel.py:8 +msgid "Alias" +msgstr "Alias" + +#: common/models/descriptionmodel.py:8 common/models/draft.py:8 msgid "Description" msgstr "Beschreibung" @@ -147,7 +169,7 @@ msgstr "Datum" msgid "Session" msgstr "Session" -#: days/models.py:17 days/templates/days/day_detail.jinja:30 +#: days/models.py:17 days/templates/days/day_detail.jinja:32 msgid "Sessions" msgstr "Sessions" @@ -167,7 +189,7 @@ msgstr "Tag" msgid "Add Day" msgstr "Tag hinzufügen" -#: factions/models.py:18 templates/tenantbase.jinja:34 +#: factions/models.py:12 templates/tenantbase.jinja:34 msgid "Factions" msgstr "Fraktionen" @@ -180,11 +202,11 @@ msgid "Members" msgstr "Mitglieder" #: locations/models.py:19 locations/templates/locations/detail.jinja:41 -#: notes/models.py:20 notes/templates/notes/detail.jinja:41 +#: notes/models.py:19 notes/templates/notes/detail.jinja:41 msgid "Part of" msgstr "Teil von" -#: locations/models.py:22 loot/models.py:18 notes/models.py:23 +#: locations/models.py:22 loot/models.py:18 notes/models.py:22 msgid "Image" msgstr "Bild" @@ -256,27 +278,27 @@ msgstr "Speichern" msgid "Item" msgstr "Objekt" -#: loot/templates/loot/overview.jinja:15 loot/templates/loot/overview.jinja:81 +#: loot/templates/loot/overview.jinja:15 loot/templates/loot/overview.jinja:83 msgid "Total Value" msgstr "Gesamtwert" -#: loot/templates/loot/overview.jinja:65 +#: loot/templates/loot/overview.jinja:67 msgid "Value each" msgstr "Wert pro Stück" -#: loot/templates/loot/overview.jinja:69 +#: loot/templates/loot/overview.jinja:71 msgid "Weight" msgstr "Gewicht" -#: loot/templates/loot/overview.jinja:84 +#: loot/templates/loot/overview.jinja:86 msgid "Add Loot" msgstr "Loot hinzufügen" -#: notes/models.py:27 +#: notes/models.py:26 msgid "Note" msgstr "Notiz" -#: notes/models.py:28 templates/tenantbase.jinja:30 +#: notes/models.py:27 templates/tenantbase.jinja:30 msgid "Notes" msgstr "Notizen" @@ -315,29 +337,46 @@ msgid "You might want to go back to the homepage." msgstr "" "Du möchtest vielleicht zurück zur Startseite gehen." -#: templates/base.jinja:37 templates/tenantbase.jinja:76 +#: templates/base.jinja:37 templates/tenantbase.jinja:82 msgid "Log out" msgstr "Abmelden" -#: templates/base.jinja:39 templates/common/homepage.jinja:18 +#: templates/base.jinja:39 templates/common/homepage.jinja:20 #: templates/registration/login.jinja:21 msgid "Log in" msgstr "Anmelden" -#: templates/common/homepage.jinja:8 +#: templates/common/demo_readonly.jinja:8 +msgid "" +"This campain is just intended to be a public demo of RPGnotes. Therefore, " +"content can't be edited." +msgstr "" +"Diese Kampagne ist nur als öffentliche Demo von RPGnotes gedacht. Daher kann " +"der Inhalt nicht bearbeitet werden." + +#: templates/common/demo_readonly.jinja:14 +msgid "Go back" +msgstr "Zurück" + +#: templates/common/homepage.jinja:10 msgid "" "An experimental, collaborative note taking app and wiki optimized for RPG " "games." msgstr "" +"Eine experimentelle, kollaborative Notiz-App und Wiki optimiert für RPGs" -#: templates/common/homepage.jinja:15 +#: templates/common/homepage.jinja:17 msgid "List of Campaigns" msgstr "Liste der Campaigns" -#: templates/common/homepage.jinja:21 +#: templates/common/homepage.jinja:23 msgid "Sign up" msgstr "Registrieren" +#: templates/common/homepage.jinja:26 +msgid "Demo Campain" +msgstr "Demo Kampagne" + #: templates/common/languageselect.jinja:3 #: templates/common/languageselect.jinja:6 templates/tenantbase.jinja:66 msgid "Change Language" @@ -354,7 +393,7 @@ msgstr "Aktivierung fehlgeschlagen" #: templates/registration/activation_failed.jinja:6 msgid "Maybe this activation link has already been clicked before." -msgstr "" +msgstr "Vielleicht wurde dieser Aktivierungslink schon einmal geklickt" #: templates/registration/login.jinja:6 msgid "Login" @@ -397,7 +436,7 @@ msgstr "Suchen" msgid "Go!" msgstr "Los!" -#: templates/tenantbase.jinja:72 users/templates/users/edit.jinja:5 +#: templates/tenantbase.jinja:74 users/templates/users/edit.jinja:5 msgid "Edit User Account" msgstr "Benutzerkonto bearbeiten" @@ -405,7 +444,7 @@ msgstr "Benutzerkonto bearbeiten" msgid "Email Address" msgstr "E-Mail-Adresse" -#: users/views.py:37 +#: users/views.py:38 msgid "" "You account was created. Please click the confirmation link in the E-Mail to " "activate it." @@ -413,14 +452,11 @@ msgstr "" "Dein Account wurde erstellt. Bitte klicke auf den Bestätigungslink in der E-" "Mail um ihn zu aktivieren." -#: users/views.py:51 +#: users/views.py:52 msgid "Account was successfully activated. You can log in now." msgstr "" "Der Account wurde erfolgreich aktiviert. Du kannst dich jetzt damit anmelden." -#: users/views.py:61 +#: users/views.py:62 msgid "User account was updated successfully" msgstr "Benutzeraccount wurde erfolgreich bearbeitet" - -#~ msgid "Nobody" -#~ msgstr "Niemand" diff --git a/loot/views.py b/loot/views.py index b0d1706..3225c79 100644 --- a/loot/views.py +++ b/loot/views.py @@ -15,7 +15,6 @@ class LootListView(generic.ListView): def get_context_data(self, **kwargs): data = super().get_context_data(**kwargs) data['total_value'] = self.get_queryset().aggregate(Sum("value_gold"))["value_gold__sum"] - print(data['total_value']) return data diff --git a/search/views.py b/search/views.py index 9759e65..9f56279 100644 --- a/search/views.py +++ b/search/views.py @@ -20,7 +20,6 @@ class SearchResultsView(TemplateView): template_name = "search/search_results.jinja" def get_context_data(self, **kwargs): - print(self.request.GET) if "q" not in self.request.GET: return "" query_string = self.request.GET['q'] diff --git a/static/scss/_autocomple.scss b/static/scss/_autocomple.scss index 90b346f..012c4fc 100644 --- a/static/scss/_autocomple.scss +++ b/static/scss/_autocomple.scss @@ -69,3 +69,9 @@ transform: translateY(-50%) rotate(359deg); } } + + +#autocomplete input { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} diff --git a/static/scss/_misc.scss b/static/scss/_misc.scss index 7318411..b964bb0 100644 --- a/static/scss/_misc.scss +++ b/static/scss/_misc.scss @@ -101,3 +101,4 @@ footer { .lum-lightbox { z-index: 50; } + diff --git a/templates/common/demo_readonly.jinja b/templates/common/demo_readonly.jinja new file mode 100644 index 0000000..fd6bf29 --- /dev/null +++ b/templates/common/demo_readonly.jinja @@ -0,0 +1,22 @@ +{% extends "base.jinja" %} + +{% block mainpage %} +
+

Can't edit demo instance

+
+

+ {% trans trimmed %} + This campain is just intended to be a public demo of RPGnotes. Therefore, content can't be edited. + {% endtrans %} +

+ +
+
+{% endblock %} diff --git a/templates/common/homepage.jinja b/templates/common/homepage.jinja index 44b6959..7b5cff4 100644 --- a/templates/common/homepage.jinja +++ b/templates/common/homepage.jinja @@ -1,5 +1,7 @@ {% extends "base.jinja" %} +{% block title %}RPGnotes{% endblock %} + {% block mainpage %}

RPG notes

@@ -20,6 +22,10 @@ {% trans %}Sign up{% endtrans %} + + {% trans %}Demo Campain{% endtrans %} + + {% endif %}
diff --git a/templates/tenantbase.jinja b/templates/tenantbase.jinja index c9a3a2f..9c8b2cc 100644 --- a/templates/tenantbase.jinja +++ b/templates/tenantbase.jinja @@ -68,13 +68,21 @@ {% if user.is_staff %}
  • Admin
  • {% endif %} -
  • {% trans %}Edit User Account{% endtrans %}
  • -
  • - -
  • -
  • {% trans %}Log out{% endtrans %} -
  • + {% if user.is_authenticated %} +
  • + + {% trans %}Edit User Account{% endtrans %} + +
  • +
  • + +
  • +
  • + + {% trans %}Log out{% endtrans %} + +
  • + {% endif %} diff --git a/users/forms.py b/users/forms.py index c0b08bf..4fcdfb2 100644 --- a/users/forms.py +++ b/users/forms.py @@ -29,8 +29,6 @@ class CustomUserChangeForm(UserChangeForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) password = self.fields.get('password') - print(password.help_text) password.help_text = password.help_text.replace("../password/", reverse("password_change")) - print(password.help_text) self.fields['email'].disabled = True self.fields['last_login'].disabled = True diff --git a/users/views.py b/users/views.py index 4d2a301..9ace0fc 100644 --- a/users/views.py +++ b/users/views.py @@ -1,4 +1,5 @@ from django.contrib import messages +from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.messages.views import SuccessMessageMixin from django.core.mail import mail_admins from django.urls import reverse_lazy @@ -53,7 +54,7 @@ class CustomActivationView(ActivationView): return user -class UserEditView(SuccessMessageMixin, UpdateView): +class UserEditView(LoginRequiredMixin, SuccessMessageMixin, UpdateView): template_name = "users/edit.jinja" model = TenantUser form_class = CustomUserChangeForm diff --git a/utils/languages.py b/utils/languages.py new file mode 100644 index 0000000..8bec0c3 --- /dev/null +++ b/utils/languages.py @@ -0,0 +1,37 @@ +""" +list of languages supported by postgresql fulltext search + +SELECT cfgname FROM pg_ts_config + +""" +full_text_languages = [ + "simple", + "arabic", + "danish", + "dutch", + "english", + "finnish", + "french", + "german", + "greek", + "hungarian", + "indonesian", + "irish", + "italian", + "lithuanian", + "nepali", + "norwegian", + "portuguese", + "romanian", + "russian", + "spanish", + "swedish", + "tamil", + "turkish" +] +full_text_languages_choice = [] +for lang in full_text_languages: + full_text_languages_choice.append(( + lang, + "Other" if lang == "simple" else lang.title() + ))