rebelstuff

Keep track of your stuff
git clone https://git.ce9e.org/rebelstuff.git

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