- commit
- 3ce3127d96484f769092973022bb02a89f12b7fc
- parent
- 0af1339798783ec0b00880d77018051c68944ccd
- Author
- Tobias Bengfort <tobias.bengfort@posteo.de>
- Date
- 2020-02-23 22:01
add contract view
Diffstat
| M | rebelstuff/admin.py | 9 | +++++++++ |
| A | rebelstuff/templates/admin/rebelstuff/change_form.html | 9 | +++++++++ |
| M | rebelstuff/views.py | 55 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| M | settings/base.py | 3 | +++ |
4 files changed, 76 insertions, 0 deletions
diff --git a/rebelstuff/admin.py b/rebelstuff/admin.py
@@ -4,9 +4,11 @@ from django.conf import settings 4 4 from django.contrib.auth.admin import UserAdmin 5 5 from django.contrib.auth import models as auth_models 6 6 from django.contrib import admin -1 7 from django.urls import path 7 8 from django.utils.translation import gettext_lazy as _ 8 9 9 10 from . import models -1 11 from .views import ContractView 10 12 11 13 today = datetime.date.today() 12 14 @@ -40,6 +42,13 @@ class BookingAdmin(admin.ModelAdmin): 40 42 inlines = [BookingItemInline] 41 43 readonly_fields = ['price'] 42 44 -1 45 def get_urls(self): -1 46 return [path( -1 47 '<int:pk>/contract/', -1 48 ContractView.as_view(), -1 49 name='rebelstuff_booking_contract', -1 50 )] + super().get_urls() -1 51 43 52 44 53 site = Site() 45 54 site.register(auth_models.User, UserAdmin)
diff --git a/rebelstuff/templates/admin/rebelstuff/change_form.html b/rebelstuff/templates/admin/rebelstuff/change_form.html
@@ -0,0 +1,9 @@
-1 1 {% extends "admin/change_form.html" %}
-1 2 {% load i18n admin_urls %}
-1 3
-1 4 {% block object-tools-items %}
-1 5 {% if opts.label == 'rebelstuff.Booking' %}
-1 6 <li><a href="{% url opts|admin_urlname:'contract' original.pk %}">{% trans 'Contract' %}</a></li>
-1 7 {% endif %}
-1 8 {{ block.super }}
-1 9 {% endblock %}
diff --git a/rebelstuff/views.py b/rebelstuff/views.py
@@ -1,8 +1,18 @@ 1 1 import datetime -1 2 import zipfile -1 3 -1 4 from django.conf import settings 2 5 from django.contrib.auth.mixins import PermissionRequiredMixin -1 6 from django.http import Http404 -1 7 from django.http import HttpResponse -1 8 from django.template import Context -1 9 from django.template import Template -1 10 from django.utils.text import slugify 3 11 from django.utils.translation import gettext_lazy as _ 4 12 from django.views.generic.base import TemplateView -1 13 from django.views.generic.detail import BaseDetailView 5 14 -1 15 from .models import Booking 6 16 from .models import Stuff 7 17 8 18 @@ -34,3 +44,48 @@ class CalendarView(PermissionRequiredMixin, TemplateView): 34 44 context['has_permission'] = True 35 45 36 46 return context -1 47 -1 48 -1 49 class ContractView(PermissionRequiredMixin, BaseDetailView): -1 50 model = Booking -1 51 permission_required = 'rebelstuff.view_booking' -1 52 -1 53 def get_context_data(self, **kwargs): -1 54 context = super().get_context_data(**kwargs) -1 55 context['booking'] = self.object -1 56 context['item_list'] = self.object.bookingitem_set.all() -1 57 return context -1 58 -1 59 def render_content(self): -1 60 with open(settings.CONTRACT_TEMPLATE, 'r') as fh: -1 61 template = Template(fh.read()) -1 62 context = Context(self.get_context_data()) -1 63 return template.render(context) -1 64 -1 65 def get(self, request, *args, **kwargs): -1 66 if not settings.CONTRACT_TEMPLATE or not settings.CONTRACT_REFERENCE: -1 67 raise Http404 -1 68 -1 69 self.object = self.get_object() -1 70 -1 71 response = HttpResponse( -1 72 content_type='application/vnd.oasis.opendocument.text', -1 73 ) -1 74 -1 75 response['Content-Disposition'] = 'attachment; filename="%s_%s.odt"' % ( -1 76 self.object.start.strftime('%Y-%m-%d'), -1 77 slugify(self.object.name), -1 78 ) -1 79 -1 80 zresponse = zipfile.ZipFile(response, 'w') -1 81 with zipfile.ZipFile(settings.CONTRACT_REFERENCE, 'r') as zin: -1 82 for name in zin.namelist(): -1 83 if name == 'content.xml': -1 84 content = self.render_content().encode('utf8') -1 85 else: -1 86 with zin.open(name, 'r') as fh: -1 87 content = fh.read() -1 88 with zresponse.open(name, 'w') as fh: -1 89 fh.write(content) -1 90 -1 91 return response
diff --git a/settings/base.py b/settings/base.py
@@ -106,3 +106,6 @@ CALENDAR_COLORS = [ 106 106 '#984ea3', 107 107 '#ff7f00', 108 108 ] -1 109 -1 110 CONTRACT_TEMPLATE = None -1 111 CONTRACT_REFERENCE = None