diff --git a/Makefile b/Makefile
index dea78db..0964b91 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,8 @@
+.PHONY: things
+all: makemessages compilemessages
+
makemessages:
- python manage.py makemessages -l de --extension=html,txt,jinja,py
+ python manage.py makemessages -l de --extension=html,txt,jinja,py --ignore "node_modules/*"
compilemessages:
python manage.py compilemessages
diff --git a/campaigns/templates/campaigns/campaign_detail.jinja b/campaigns/templates/campaigns/campaign_detail.jinja
index e2a4fe8..686355c 100644
--- a/campaigns/templates/campaigns/campaign_detail.jinja
+++ b/campaigns/templates/campaigns/campaign_detail.jinja
@@ -20,6 +20,6 @@
{% trans %}Homepage{% endtrans %}
-
{% endif %}
+ {% trans %}Export{% endtrans %}
{% endblock %}
diff --git a/campaigns/templates/campaigns/campaign_export.jinja b/campaigns/templates/campaigns/campaign_export.jinja
new file mode 100644
index 0000000..4cf4f09
--- /dev/null
+++ b/campaigns/templates/campaigns/campaign_export.jinja
@@ -0,0 +1,13 @@
+{% extends "tenantbase.jinja" %}
+
+{% block title %}{% trans %}Export{% endtrans %}{% endblock %}
+
+{% block content %}
+
{% trans %}Export{% endtrans %}
+
+ {% trans trimmed %}
+ RPGnotes is an experimental website.
+ To avoid lock-in of campaign data, you can always export all of your data here:
+ {% endtrans %}
+ {% trans %}Export{% endtrans %}
+{% endblock %}
diff --git a/campaigns/urls.py b/campaigns/urls.py
index 953e739..cf3b58b 100644
--- a/campaigns/urls.py
+++ b/campaigns/urls.py
@@ -5,5 +5,7 @@ from campaigns import views as campaign_views
urlpatterns = [
path("", campaign_views.CampaignDetailView.as_view(), name="campaigndetail"),
path("edit", campaign_views.CampaignEditView.as_view(), name="campaignedit"),
+ path("export", campaign_views.ExportHelpView.as_view(), name="export"),
+ path("export/data", campaign_views.export, name="exportdata"),
path("delete", campaign_views.CampaignDeleteView.as_view(), name="campaigndelete"),
]
diff --git a/campaigns/views.py b/campaigns/views.py
index 7e5c0b5..cbaedaa 100644
--- a/campaigns/views.py
+++ b/campaigns/views.py
@@ -1,14 +1,23 @@
from django.contrib.auth.mixins import LoginRequiredMixin
+from django.core import serializers
from django.core.mail import mail_admins
+from django.http import HttpResponse, HttpRequest, JsonResponse
from django.shortcuts import redirect
from django.urls import reverse_lazy
from django.utils.text import slugify
from django.views import generic
+from django.views.generic import TemplateView
from tenant_users.tenants.tasks import provision_tenant
from campaigns.forms import CampaignForm
from campaigns.models import Campaign
+from characters.models import Character
from common.middlewares import demo_campaign_id
+from days.models import Session, IngameDay
+from factions.models import Faction
+from locations.models import Location
+from loot.models import Loot, LootType
+from notes.models import Note
from users.models import TenantUser
@@ -86,3 +95,28 @@ class CampaignDeleteView(LoginRequiredMixin, generic.DeleteView):
self.object: Campaign = self.get_object()
self.object.delete_tenant()
return redirect("http://test.localhost:8000/")
+
+
+class ExportHelpView(TemplateView):
+ template_name = "campaigns/campaign_export.jinja"
+
+
+def export(request: HttpRequest) -> HttpResponse:
+ models = {
+ "characters": Character,
+ "sessions": Session,
+ "ingameday": IngameDay,
+ "factions": Faction,
+ "locations": Location,
+ "loottype": LootType,
+ "loot": Loot,
+ "notes": Note,
+
+ }
+ data = {}
+ for name, obj in models.items():
+ data[name] = serializers.serialize("python", obj.objects.all())
+
+ data["campaign"] = serializers.serialize("python", [request.tenant])[0]
+ # return JsonResponse({"c": list(Character.objects.all().values())})
+ return JsonResponse(data, safe=False)
diff --git a/common/views.py b/common/views.py
index bb55728..373e0a0 100644
--- a/common/views.py
+++ b/common/views.py
@@ -52,13 +52,13 @@ def save_draft(request: HttpRequest) -> HttpResponse:
@condition(etag_func=calc_etag)
-def debug_css(request):
+def debug_css(request: HttpRequest) -> HttpResponse:
css, source_map = get_css(debug=True)
return HttpResponse(css, content_type="text/css")
@condition(etag_func=calc_etag)
-def debug_css_sourcemap(request):
+def debug_css_sourcemap(request: HttpRequest) -> HttpResponse:
css, source_map = get_css(debug=True)
return HttpResponse(source_map, content_type="application/json")
diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo
index 418b7a5..38c4c5e 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 93b2694..1297e38 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-07-05 21:15+0200\n"
+"POT-Creation-Date: 2022-11-30 14:01+0100\n"
"PO-Revision-Date: 2022-06-19 14:13+0200\n"
"Last-Translator: Lukas Winkler \n"
"Language-Team: \n"
@@ -18,7 +18,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 3.1\n"
-#: campaigns/models.py:12 common/models/nameslugmodel.py:8 loot/models.py:14
+#: campaigns/models.py:12 common/models/nameslugmodel.py:8 loot/models.py:24
#: users/models.py:10
msgid "Name"
msgstr "Name"
@@ -47,15 +47,29 @@ msgstr ""
msgid "Homepage"
msgstr "Startseite"
+#: campaigns/templates/campaigns/campaign_detail.jinja:24
+#: campaigns/templates/campaigns/campaign_export.jinja:3
+#: campaigns/templates/campaigns/campaign_export.jinja:6
+#: campaigns/templates/campaigns/campaign_export.jinja:12
+msgid "Export"
+msgstr "Export"
+
#: campaigns/templates/campaigns/campaign_edit.jinja:5
msgid "Add new campaign"
msgstr "Neue Campagne erstellen"
#: campaigns/templates/campaigns/campaign_edit.jinja:9
-#: loot/templates/loot/edit.jinja:27 loot/templates/loot/edit.jinja:30
+#: loot/templates/loot/edit.jinja:18 loot/templates/loot/edit.jinja:21
msgid "Add"
msgstr "Hinzufügen"
+#: campaigns/templates/campaigns/campaign_export.jinja:8
+msgid ""
+"RPGnotes is an experimental website. To avoid lock-in of campaign data, you "
+"can always export all of your data here:"
+msgstr "RPGnotes ist eine experimentelle Webseite. Damit Campaign-Daten weiterverwendet werden können, "
+"können hier immer alle Daten exportiert werden:"
+
#: campaigns/templates/campaigns/campaign_overview.jinja:3
#: campaigns/templates/campaigns/campaign_overview.jinja:9
msgid "Campaign Overview"
@@ -92,7 +106,7 @@ msgid "Faction"
msgstr "Fraktion"
#: characters/models.py:41 characters/templates/characters/detail.jinja:61
-#: locations/models.py:26 loot/models.py:28
+#: locations/models.py:26 loot/models.py:38
#: loot/templates/loot/overview.jinja:17
msgid "Location"
msgstr "Ort"
@@ -133,7 +147,7 @@ msgstr "Charakter hinzufügen"
#: days/templates/days/day_detail.jinja:24
#: factions/templates/factions/detail.jinja:24
#: locations/templates/locations/detail.jinja:22
-#: loot/templates/loot/overview.jinja:60 notes/templates/notes/detail.jinja:22
+#: loot/templates/loot/overview.jinja:62 notes/templates/notes/detail.jinja:22
msgid "Edit"
msgstr "Bearbeiten"
@@ -206,7 +220,7 @@ msgstr "Mitglieder"
msgid "Part of"
msgstr "Teil von"
-#: locations/models.py:22 loot/models.py:18 notes/models.py:22
+#: locations/models.py:22 loot/models.py:28 notes/models.py:22
msgid "Image"
msgstr "Bild"
@@ -222,27 +236,36 @@ msgstr "Ort hinzufügen"
msgid "Contains"
msgstr "Enthält"
-#: loot/models.py:15 loot/templates/loot/overview.jinja:14
+#: loot/models.py:25 loot/templates/loot/overview.jinja:14
msgid "Quantity"
msgstr "Anzahl"
-#: loot/models.py:16
+#: loot/models.py:26
msgid "Value (Gold)"
msgstr "Wert (Gold)"
-#: loot/models.py:17
+#: loot/models.py:27
msgid "Weight (lb)"
msgstr "Gewicht (lb)"
-#: loot/models.py:22 loot/templates/loot/overview.jinja:16
+#: loot/models.py:32 loot/templates/loot/overview.jinja:16
msgid "Claimant"
msgstr "Beansprucht von"
-#: loot/models.py:31
+#: loot/models.py:41
msgid "Magic Item"
msgstr "Magisches Item"
-#: loot/models.py:35 loot/models.py:36 loot/templates/loot/overview.jinja:3
+#: loot/models.py:42
+msgid "Former"
+msgstr "Ehemalig"
+
+#: loot/models.py:46 loot/templates/loot/overview.jinja:18
+#: loot/templates/loot/overview.jinja:77
+msgid "Type"
+msgstr "Typ"
+
+#: loot/models.py:51 loot/models.py:52 loot/templates/loot/overview.jinja:3
#: loot/templates/loot/overview.jinja:6 templates/tenantbase.jinja:42
msgid "Loot"
msgstr "Loot"
@@ -252,45 +275,43 @@ msgstr "Loot"
msgid "Edit \"%(object)s\""
msgstr "\"%(object)s\" bearbeiten"
-#: loot/templates/loot/edit.jinja:7 loot/templates/loot/edit.jinja:9
-#: loot/templates/loot/edit.jinja:11 loot/templates/loot/edit.jinja:13
-msgid "Delete"
-msgstr "Löschen"
-
-#: loot/templates/loot/edit.jinja:16
+#: loot/templates/loot/edit.jinja:7
msgid "Add new"
msgstr "Neu erstellen"
-#: loot/templates/loot/edit.jinja:22
-#, fuzzy
-#| msgid "Session"
+#: loot/templates/loot/edit.jinja:15
msgid "Add Session"
-msgstr "Session"
+msgstr "Session hinzufügen"
-#: loot/templates/loot/edit.jinja:27 loot/templates/loot/edit.jinja:30
+#: loot/templates/loot/edit.jinja:18 loot/templates/loot/edit.jinja:21
#: templates/common/languageselect.jinja:17
#: templates/registration/registration_form.jinja:9
#: users/templates/users/edit.jinja:10
msgid "Save"
msgstr "Speichern"
+#: loot/templates/loot/edit.jinja:24 loot/templates/loot/edit.jinja:26
+#: loot/templates/loot/edit.jinja:28 loot/templates/loot/edit.jinja:30
+msgid "Delete"
+msgstr "Löschen"
+
#: loot/templates/loot/overview.jinja:13
msgid "Item"
msgstr "Objekt"
-#: loot/templates/loot/overview.jinja:15 loot/templates/loot/overview.jinja:83
+#: loot/templates/loot/overview.jinja:15 loot/templates/loot/overview.jinja:89
msgid "Total Value"
msgstr "Gesamtwert"
-#: loot/templates/loot/overview.jinja:67
+#: loot/templates/loot/overview.jinja:69
msgid "Value each"
msgstr "Wert pro Stück"
-#: loot/templates/loot/overview.jinja:71
+#: loot/templates/loot/overview.jinja:73
msgid "Weight"
msgstr "Gewicht"
-#: loot/templates/loot/overview.jinja:86
+#: loot/templates/loot/overview.jinja:92
msgid "Add Loot"
msgstr "Loot hinzufügen"
@@ -306,11 +327,11 @@ msgstr "Notizen"
msgid "Add Note"
msgstr "Notiz hinzufügen"
-#: rpg_notes/settings.py:196
+#: rpg_notes/settings.py:197
msgid "German"
msgstr "Deutsch"
-#: rpg_notes/settings.py:197
+#: rpg_notes/settings.py:198
msgid "English"
msgstr "Englisch"
@@ -332,16 +353,17 @@ msgid "Permission Denied"
msgstr "Zugriff verweigert"
#: templates/403.jinja:10
-#, python-format
-msgid "You might want to go back to the homepage."
+msgid ""
+"You might want to go back to the homepage."
msgstr ""
-"Du möchtest vielleicht zurück zur Startseite gehen."
+"Du möchtest vielleicht zurück zur Startseite gehen."
-#: templates/base.jinja:37 templates/tenantbase.jinja:88
+#: templates/base.jinja:39 templates/tenantbase.jinja:88
msgid "Log out"
msgstr "Abmelden"
-#: templates/base.jinja:39 templates/common/homepage.jinja:20
+#: templates/base.jinja:41 templates/common/homepage.jinja:20
#: templates/registration/login.jinja:21
msgid "Log in"
msgstr "Anmelden"
@@ -361,7 +383,7 @@ msgstr "Zurück"
#: templates/common/homepage.jinja:10
msgid ""
"An experimental, collaborative note taking app and wiki optimized for RPG "
-"games."
+"games"
msgstr ""
"Eine experimentelle, kollaborative Notiz-App und Wiki optimiert für RPGs"
diff --git a/templates/common/homepage.jinja b/templates/common/homepage.jinja
index 7b5cff4..7407dd0 100644
--- a/templates/common/homepage.jinja
+++ b/templates/common/homepage.jinja
@@ -8,7 +8,7 @@
{% trans trimmed %}
- An experimental, collaborative note taking app and wiki optimized for RPG games.
+ An experimental, collaborative note taking app and wiki optimized for RPG games
{% endtrans %}