From 07fd3c679f81c366cc68cd668279689e4f3385fb Mon Sep 17 00:00:00 2001 From: Lukas Winkler Date: Wed, 30 Nov 2022 14:05:37 +0100 Subject: [PATCH] add export feature --- Makefile | 5 +- .../templates/campaigns/campaign_detail.jinja | 2 +- .../templates/campaigns/campaign_export.jinja | 13 +++ campaigns/urls.py | 2 + campaigns/views.py | 34 +++++++ common/views.py | 4 +- locale/de/LC_MESSAGES/django.mo | Bin 6024 -> 6478 bytes locale/de/LC_MESSAGES/django.po | 92 +++++++++++------- templates/common/homepage.jinja | 2 +- 9 files changed, 114 insertions(+), 40 deletions(-) create mode 100644 campaigns/templates/campaigns/campaign_export.jinja 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 418b7a5455e73bc2a4a0dd1b8276e327eed811ee..38c4c5ebd39628b3ab8d60840ffa91fec104eebd 100644 GIT binary patch delta 2735 zcmZ{kd2Cfh6o;oRON+EZSp|eEh^%edu~lU2A_Xi<3k5;A^j-R%eVgxHTk4V*AQBc6 zh?QU(V}OJ|6r#oklM-A&Vgv=$7!hJH7!3wvqM=bSA^QDZ=Oz8e$vyWwXXebzIcMhH z-6fZ1q^=kCI%sG?WE8R?$C!Qa^*+34pXC}e7oLX$VOE|oxR^mO9}a_k;dpotEQ0-E zDP)SNw5+k?^-%r+IKY^c38VC;<3&5L6Bc0agEg=nYN1(}ki5ci>|%n<%Q`La0n$h6>~rD8ECH#~kLRz)wI0 z*adYt@j($dbeSUJUUEa6vxxAA(X#hc%mQ7ImwG>c)Ile%LB0CCIk$0d1IR!QG3|t2< z!j*6WH*h{|h1swZ>QbKOrL+A4s#0IV#aYID3zuV$pj;zh5Nh3>DHK&;Kg7ozgM;Bo zYhQqTCgvLCF~9Os>Fz?3Gy}P*!{8XG4d+4yJ`c*j94>)tpb|R_HUBu&eyNX8bXhK2 zhpTqrC#VIxpi20UwR4!Q4D+B$m=85x2o=yss7g+PJZ26rZCni%XdN65BamXI%q|oy za1bi;H>`aOYU110?u0t~vz8a20{GhU3Y7o%a2C7?b!4L`r~I0s)_)#qogJ{hzW==_ zD%By#9P=hrh95vpJOdTrr1%ICnf z{t(y*$HEP8?{Mm0iE@(;EmTYzs>BQ^y8^0&OCVp7S%I*oS&FF5>V_$SLFWt(XZ7s$V$a-WZ@*tw7Bbk73TImZFgqijvihfjT z`ejc;bSL^E6$l?ix_P{3TYV(|B{K(OjqR8Ob%QzXbSvh)$?CcnbylAUbuTh)9m-s5 zEP}ahk=#RlS9{51C>Cw|H+NUtuDq+GE4IaB3Exz@4L;o&CQW555%Cfov3@^frB+l$ zW4@PkLP^JsI^MRpmk33?sPBfI7H>;3I7Who$9p4o~0}5xZxJJHK}#j87nMb1`}yNC+H=-GPBBS3?==9OH>{8{Y$fQYFp!N z`}4015Bh#QSyob#h&QIADh{_yFLwQsj!40)*_re@x(2jojmzYgaGSc5vx*lr6+tiJ zhC_`VM+)!sOwf0{P}J*@qZbZ)&RVkc(rK2vk&y2!wuu#$yS^8t2#h6~y+n%_4R}6w zB0zW3C+|n2UUX_kae^T);e;a8RatvZ_iS(502P9<%*?Wm*9NzAXIwC}>whzD%Nv&Z E4~|e=7XSbN delta 2303 zcmYk-Z)_Ar7{~EvYn2{Q`cI%ILRemaUF>Vj#q&4;FXJQ}#L4&z z^0AxFyQqE^G0TS>yw}XPC>32O!6{gd8*njdfG*U;J(!25kdK|^FcEuE{rZprZNRlN zm`!^amGFpb|Bkx1KXEei+h0_axyNXQn2Y*iDQe=FvkG;`b*O|lJ9nZI*n=9l&7D7p zn%GB;cNo?0C_aV9v7Y&DfQmAoK^E#*hUz#Ql~^SQE$K2;Lba&t4M^_Rh?;mGDzOgK zc!yBqy@O0)UAPQSp!)TruMQb18t@vbJ%Sow6xHz-YT~=7i6Ug9^Z7Uzi&5WSjeKl9 zhazmiso07d_g&QYyHQ)+qxIKA_X#I7Krd?GORjy{wKJ|gguA(Z17ldve&~B`NN)Cq z^9bttaipuAL#@C?R03B}{WH0&|5hr$a$+S`lhz7+3$ySW)I;|zYA**+D{~cVJhPv1 zJ?&XM(hpz@YTz!^ou^RWKaKa}SFYWUd~C?)sHMGy6nL_s2r8?Jmh0>4t1D7 z-BAx}sXszZbO!ZIoOjoMaObb0#v4Jc*dMO#-=U&A8$<2UKdwU-uYwYqgj&KVYNFYw ziI<`hU4zBA16d4v9W}ub=XaaaF}#54ciUYbb7oHqujiq!r?r}j9-dm%1Y1x8@4`K} z57*)#Ca{c+*AnkV-Fb^^`=}K=jJzB{+2RzMO9`oHB`Cgai)x}R9$ehCM{AAXN0MEe~qp{PqG3y=pOn z-=W}jT8Apy_nM#<9PzvD?d*87sXdu0DTt&hr2O 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 %}