1
0
Fork 0
mirror of https://github.com/Findus23/RPGnotes.git synced 2024-09-19 15:43:45 +02:00

add readonly demo and other minor fixes

This commit is contained in:
Lukas Winkler 2022-07-05 20:22:13 +02:00
parent d88b331bf2
commit 872d61caea
Signed by: lukas
GPG key ID: 54DE4D798D244853
17 changed files with 203 additions and 57 deletions

View file

@ -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"]

View file

@ -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

View file

@ -3,11 +3,23 @@
{% block title %}{{ object }}{% endblock %}
{% block content %}
<h1>{{ object }}</h1>
<h2>{% trans %}Players{% endtrans %}</h2>
<ul>
{% for user,characters in players.items() %}
<li>{{ user }}{% if characters %} ({{ characters|join(", ") }}){% endif %}</li>
{% endfor %}
</ul>
{% if not is_demo %}
<h1>{{ object }}</h1>
<h2>{% trans %}Players{% endtrans %}</h2>
<ul>
{% for user,characters in players.items() %}
<li>{{ user }}{% if characters %} ({{ characters|join(", ") }}){% endif %}</li>
{% endfor %}
</ul>
{% else %}
<h1>RPGnotes Demo</h1>
<p>
{% 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 %}
</p>
<a href="https://rpgnotes.lw1.at/ " class="btn btn-primary btn-lg px-4 gap-3" target="_blank">
{% trans %}Homepage{% endtrans %}
</a>
{% endif %}
{% endblock %}

View file

@ -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):

View file

@ -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():

Binary file not shown.

View file

@ -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 <translations@lw1.at>\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 <a href=\"%(url)s\">homepage</a>."
msgstr ""
"Du möchtest vielleicht zurück zur <a href=\"%(url)s\">Startseite</a> 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"

View file

@ -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

View file

@ -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']

View file

@ -69,3 +69,9 @@
transform: translateY(-50%) rotate(359deg);
}
}
#autocomplete input {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}

View file

@ -101,3 +101,4 @@ footer {
.lum-lightbox {
z-index: 50;
}

View file

@ -0,0 +1,22 @@
{% extends "base.jinja" %}
{% block mainpage %}
<div class="px-4 py-5 my-5 text-center">
<h1 class="display-5 fw-bold">Can't edit demo instance</h1>
<div class="col-lg-6 mx-auto">
<p class="lead mb-4">
{% trans trimmed %}
This campain is just intended to be a public demo of RPGnotes. Therefore, content can't be edited.
{% endtrans %}
</p>
<div class="d-grid gap-2 d-sm-flex justify-content-sm-center">
<a href="javascript:history.back()" class="btn btn-primary btn-lg px-4 gap-3">
{% trans %}Go back{% endtrans %}
</a>
<a href="https://rpgnotes.lw1.at/" class="btn btn-outline-secondary btn-lg px-4">
{% trans %}Homepage{% endtrans %}
</a>
</div>
</div>
</div>
{% endblock %}

View file

@ -1,5 +1,7 @@
{% extends "base.jinja" %}
{% block title %}RPGnotes{% endblock %}
{% block mainpage %}
<div class="px-4 py-5 my-5 text-center">
<h1 class="display-5 fw-bold">RPG notes</h1>
@ -20,6 +22,10 @@
<a href="{{ url("django_registration_register") }} " class="btn btn-outline-secondary btn-lg px-4">
{% trans %}Sign up{% endtrans %}
</a>
<a href="https://demo.rpgnotes.lw1.at/ " class="btn btn-primary btn-lg px-4 gap-3" target="_blank">
{% trans %}Demo Campain{% endtrans %}
</a>
{% endif %}
</div>
</div>

View file

@ -68,13 +68,21 @@
{% if user.is_staff %}
<li><a class="dropdown-item" href="/admin/">Admin</a></li>
{% endif %}
<li><a class="dropdown-item"
href="{{ main_url() }}/profile/">{% trans %}Edit User Account{% endtrans %}</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="{{ url("logout") }}">{% trans %}Log out{% endtrans %}</a>
</li>
{% if user.is_authenticated %}
<li>
<a class="dropdown-item" href="{{ main_url() }}/profile/">
{% trans %}Edit User Account{% endtrans %}
</a>
</li>
<li>
<hr class="dropdown-divider">
</li>
<li>
<a class="dropdown-item" href="{{ url("logout") }}">
{% trans %}Log out{% endtrans %}
</a>
</li>
{% endif %}
</ul>
</li>
</ul>

View file

@ -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

View file

@ -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

37
utils/languages.py Normal file
View file

@ -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()
))