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 %}
-
- {% for user,characters in players.items() %}
- - {{ user }}{% if characters %} ({{ characters|join(", ") }}){% endif %}
- {% endfor %}
-
+ {% if not is_demo %}
+ {{ object }}
+ {% trans %}Players{% endtrans %}
+
+ {% for user,characters in players.items() %}
+ - {{ user }}{% if characters %} ({{ characters|join(", ") }}){% endif %}
+ {% endfor %}
+
+ {% 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 %}
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()
+ ))