Compare commits
9 Commits
feature/in
...
embed_impr
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d881ce3a96 | ||
|
|
e3fd84c1b6 | ||
|
|
7683dc37ff | ||
|
|
85a835ed0d | ||
|
|
14836f135c | ||
|
|
5f8a77586a | ||
|
|
e5b7fdbae1 | ||
|
|
f1c8dca8c4 | ||
|
|
843b76d8ea |
@@ -1,24 +1,25 @@
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.contrib import messages
|
from RIGS import models, forms
|
||||||
from django.contrib.admin import helpers
|
|
||||||
from django.contrib.auth.admin import UserAdmin
|
from django.contrib.auth.admin import UserAdmin
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
|
||||||
from django.db import transaction
|
|
||||||
from django.db.models import Count
|
|
||||||
from django.forms import ModelForm
|
|
||||||
from django.template.response import TemplateResponse
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from reversion import revisions as reversion
|
|
||||||
from reversion.admin import VersionAdmin
|
from reversion.admin import VersionAdmin
|
||||||
|
|
||||||
from RIGS import models, forms
|
from django.contrib.admin import helpers
|
||||||
|
from django.template.response import TemplateResponse
|
||||||
|
from django.contrib import messages
|
||||||
|
from django.db import transaction
|
||||||
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
|
from django.db.models import Count
|
||||||
|
from django.forms import ModelForm
|
||||||
|
|
||||||
|
from reversion import revisions as reversion
|
||||||
|
|
||||||
# Register your models here.
|
# Register your models here.
|
||||||
admin.site.register(models.VatRate, VersionAdmin)
|
admin.site.register(models.VatRate, VersionAdmin)
|
||||||
admin.site.register(models.Event, VersionAdmin)
|
admin.site.register(models.Event, VersionAdmin)
|
||||||
admin.site.register(models.EventItem, VersionAdmin)
|
admin.site.register(models.EventItem, VersionAdmin)
|
||||||
admin.site.register(models.Invoice, VersionAdmin)
|
admin.site.register(models.Invoice)
|
||||||
admin.site.register(models.Payment, VersionAdmin)
|
admin.site.register(models.Payment)
|
||||||
|
|
||||||
|
|
||||||
@admin.register(models.Profile)
|
@admin.register(models.Profile)
|
||||||
|
|||||||
@@ -10,9 +10,8 @@ from django.template import RequestContext
|
|||||||
from django.template.loader import get_template
|
from django.template.loader import get_template
|
||||||
from django.views import generic
|
from django.views import generic
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django.db import transaction
|
|
||||||
from z3c.rml import rml2pdf
|
from z3c.rml import rml2pdf
|
||||||
import reversion
|
|
||||||
from RIGS import models
|
from RIGS import models
|
||||||
|
|
||||||
from django import forms
|
from django import forms
|
||||||
@@ -102,14 +101,14 @@ class InvoiceDelete(generic.DeleteView):
|
|||||||
|
|
||||||
def get(self, request, pk):
|
def get(self, request, pk):
|
||||||
obj = self.get_object()
|
obj = self.get_object()
|
||||||
if obj.payments.all().count() > 0:
|
if obj.payment_set.all().count() > 0:
|
||||||
messages.info(self.request, 'To delete an invoice, delete the payments first.')
|
messages.info(self.request, 'To delete an invoice, delete the payments first.')
|
||||||
return HttpResponseRedirect(reverse_lazy('invoice_detail', kwargs={'pk': obj.pk}))
|
return HttpResponseRedirect(reverse_lazy('invoice_detail', kwargs={'pk': obj.pk}))
|
||||||
return super(InvoiceDelete, self).get(pk)
|
return super(InvoiceDelete, self).get(pk)
|
||||||
|
|
||||||
def post(self, request, pk):
|
def post(self, request, pk):
|
||||||
obj = self.get_object()
|
obj = self.get_object()
|
||||||
if obj.payments.all().count() > 0:
|
if obj.payment_set.all().count() > 0:
|
||||||
messages.info(self.request, 'To delete an invoice, delete the payments first.')
|
messages.info(self.request, 'To delete an invoice, delete the payments first.')
|
||||||
return HttpResponseRedirect(reverse_lazy('invoice_detail', kwargs={'pk': obj.pk}))
|
return HttpResponseRedirect(reverse_lazy('invoice_detail', kwargs={'pk': obj.pk}))
|
||||||
return super(InvoiceDelete, self).post(pk)
|
return super(InvoiceDelete, self).post(pk)
|
||||||
@@ -160,10 +159,7 @@ class InvoiceWaiting(generic.ListView):
|
|||||||
|
|
||||||
|
|
||||||
class InvoiceEvent(generic.View):
|
class InvoiceEvent(generic.View):
|
||||||
@transaction.atomic()
|
|
||||||
@reversion.create_revision()
|
|
||||||
def get(self, *args, **kwargs):
|
def get(self, *args, **kwargs):
|
||||||
reversion.set_user(self.request.user)
|
|
||||||
epk = kwargs.get('pk')
|
epk = kwargs.get('pk')
|
||||||
event = models.Event.objects.get(pk=epk)
|
event = models.Event.objects.get(pk=epk)
|
||||||
invoice, created = models.Invoice.objects.get_or_create(event=event)
|
invoice, created = models.Invoice.objects.get_or_create(event=event)
|
||||||
@@ -188,13 +184,6 @@ class PaymentCreate(generic.CreateView):
|
|||||||
initial.update({'invoice': invoice})
|
initial.update({'invoice': invoice})
|
||||||
return initial
|
return initial
|
||||||
|
|
||||||
@transaction.atomic()
|
|
||||||
@reversion.create_revision()
|
|
||||||
def form_valid(self, form, *args, **kwargs):
|
|
||||||
reversion.add_to_revision(form.cleaned_data['invoice'])
|
|
||||||
reversion.set_comment("Payment removed")
|
|
||||||
return super().form_valid(form, *args, **kwargs)
|
|
||||||
|
|
||||||
def get_success_url(self):
|
def get_success_url(self):
|
||||||
messages.info(self.request, "location.reload()")
|
messages.info(self.request, "location.reload()")
|
||||||
return reverse_lazy('closemodal')
|
return reverse_lazy('closemodal')
|
||||||
@@ -203,12 +192,5 @@ class PaymentCreate(generic.CreateView):
|
|||||||
class PaymentDelete(generic.DeleteView):
|
class PaymentDelete(generic.DeleteView):
|
||||||
model = models.Payment
|
model = models.Payment
|
||||||
|
|
||||||
@transaction.atomic()
|
|
||||||
@reversion.create_revision()
|
|
||||||
def delete(self, *args, **kwargs):
|
|
||||||
reversion.add_to_revision(self.get_object().invoice)
|
|
||||||
reversion.set_comment("Payment removed")
|
|
||||||
return super().delete(*args, **kwargs)
|
|
||||||
|
|
||||||
def get_success_url(self):
|
def get_success_url(self):
|
||||||
return self.request.POST.get('next')
|
return self.request.POST.get('next')
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
# Generated by Django 2.0.13 on 2020-01-22 03:05
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('RIGS', '0033_auto_20180325_0016'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='payment',
|
|
||||||
name='invoice',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='payments', to='RIGS.Invoice'),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@@ -1,21 +1,24 @@
|
|||||||
from collections import Counter
|
|
||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
import hashlib
|
import hashlib
|
||||||
|
import datetime
|
||||||
import pytz
|
import pytz
|
||||||
import random
|
|
||||||
import string
|
|
||||||
from decimal import Decimal
|
|
||||||
from django.conf import settings
|
|
||||||
from django.contrib.auth.models import AbstractUser
|
|
||||||
from django.core.exceptions import ValidationError
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.urls import reverse_lazy
|
from django.contrib.auth.models import AbstractUser
|
||||||
|
from django.conf import settings
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.utils.encoding import python_2_unicode_compatible
|
|
||||||
from django.utils.functional import cached_property
|
from django.utils.functional import cached_property
|
||||||
|
from django.utils.encoding import python_2_unicode_compatible
|
||||||
from reversion import revisions as reversion
|
from reversion import revisions as reversion
|
||||||
from reversion.models import Version
|
from reversion.models import Version
|
||||||
|
import string
|
||||||
|
|
||||||
|
import random
|
||||||
|
from collections import Counter
|
||||||
|
from decimal import Decimal
|
||||||
|
|
||||||
|
from django.core.exceptions import ValidationError
|
||||||
|
from django.urls import reverse_lazy
|
||||||
|
|
||||||
|
|
||||||
# Create your models here.
|
# Create your models here.
|
||||||
@@ -527,9 +530,8 @@ class EventAuthorisation(models.Model, RevisionMixin):
|
|||||||
return str("N%05d" % self.event.pk + ' (requested by ' + self.sent_by.initials + ')')
|
return str("N%05d" % self.event.pk + ' (requested by ' + self.sent_by.initials + ')')
|
||||||
|
|
||||||
|
|
||||||
@reversion.register(follow=['payments'])
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
class Invoice(models.Model, RevisionMixin):
|
class Invoice(models.Model):
|
||||||
event = models.OneToOneField('Event', on_delete=models.CASCADE)
|
event = models.OneToOneField('Event', on_delete=models.CASCADE)
|
||||||
invoice_date = models.DateField(auto_now_add=True)
|
invoice_date = models.DateField(auto_now_add=True)
|
||||||
void = models.BooleanField(default=False)
|
void = models.BooleanField(default=False)
|
||||||
@@ -544,7 +546,7 @@ class Invoice(models.Model, RevisionMixin):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def payment_total(self):
|
def payment_total(self):
|
||||||
total = self.payments.aggregate(total=models.Sum('amount'))['total']
|
total = self.payment_set.aggregate(total=models.Sum('amount'))['total']
|
||||||
if total:
|
if total:
|
||||||
return total
|
return total
|
||||||
return Decimal("0.00")
|
return Decimal("0.00")
|
||||||
@@ -582,7 +584,7 @@ class Payment(models.Model):
|
|||||||
(ADJUSTMENT, 'TEC Adjustment'),
|
(ADJUSTMENT, 'TEC Adjustment'),
|
||||||
)
|
)
|
||||||
|
|
||||||
invoice = models.ForeignKey('Invoice', on_delete=models.CASCADE, related_name="payments")
|
invoice = models.ForeignKey('Invoice', on_delete=models.CASCADE)
|
||||||
date = models.DateField()
|
date = models.DateField()
|
||||||
amount = models.DecimalField(max_digits=10, decimal_places=2, help_text='Please use ex. VAT')
|
amount = models.DecimalField(max_digits=10, decimal_places=2, help_text='Please use ex. VAT')
|
||||||
method = models.CharField(max_length=2, choices=METHODS, null=True, blank=True)
|
method = models.CharField(max_length=2, choices=METHODS, null=True, blank=True)
|
||||||
|
|||||||
@@ -66,10 +66,10 @@ class EventOembed(generic.View):
|
|||||||
full_url = "{0}://{1}{2}".format(request.scheme, request.META['HTTP_HOST'], embed_url)
|
full_url = "{0}://{1}{2}".format(request.scheme, request.META['HTTP_HOST'], embed_url)
|
||||||
|
|
||||||
data = {
|
data = {
|
||||||
'html': '<iframe src="{0}" frameborder="0" width="100%" height="250"></iframe>'.format(full_url),
|
'html': '<iframe src="{0}" frameborder="0" width="100%" height="350"></iframe>'.format(full_url),
|
||||||
'version': '1.0',
|
'version': '1.0',
|
||||||
'type': 'rich',
|
'type': 'rich',
|
||||||
'height': '250'
|
'height': '350'
|
||||||
}
|
}
|
||||||
|
|
||||||
json = simplejson.JSONEncoderForHTML().encode(data)
|
json = simplejson.JSONEncoderForHTML().encode(data)
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 93 KiB |
|
Before Width: | Height: | Size: 151 KiB After Width: | Height: | Size: 129 KiB |
|
Before Width: | Height: | Size: 156 KiB After Width: | Height: | Size: 130 KiB |
|
Before Width: | Height: | Size: 132 KiB After Width: | Height: | Size: 109 KiB |
|
Before Width: | Height: | Size: 119 KiB After Width: | Height: | Size: 100 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 2.2 KiB |
@@ -264,7 +264,7 @@
|
|||||||
</para>
|
</para>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% for payment in object.invoice.payments.all %}
|
{% for payment in object.invoice.payment_set.all %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ payment.get_method_display }}</td>
|
<td>{{ payment.get_method_display }}</td>
|
||||||
<td>{{ payment.date }}</td>
|
<td>{{ payment.date }}</td>
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
<a class="list-group-item" href="//members.nottinghamtec.co.uk/wiki" target="_blank"><span class="glyphicon glyphicon-link"></span> TEC Wiki</a>
|
<a class="list-group-item" href="//members.nottinghamtec.co.uk/wiki" target="_blank"><span class="glyphicon glyphicon-link"></span> TEC Wiki</a>
|
||||||
<a class="list-group-item" href="http://members.nottinghamtec.co.uk/wiki/images/2/22/Event_Risk_Assesment.pdf" target="_blank"><span class="glyphicon glyphicon-link"></span> Pre-Event Risk Assessment</a>
|
<a class="list-group-item" href="http://members.nottinghamtec.co.uk/wiki/images/2/22/Event_Risk_Assesment.pdf" target="_blank"><span class="glyphicon glyphicon-link"></span> Pre-Event Risk Assessment</a>
|
||||||
<a class="list-group-item" href="//members.nottinghamtec.co.uk/price" target="_blank"><span class="glyphicon glyphicon-link"></span> Price List</a>
|
<a class="list-group-item" href="//members.nottinghamtec.co.uk/price" target="_blank"><span class="glyphicon glyphicon-link"></span> Price List</a>
|
||||||
<a class="list-group-item" href="https://form.jotformeu.com/62203600438344" target="_blank"><span class="glyphicon glyphicon-link"></span> Subhire Insurance Form</a>
|
<a class="list-group-item" href="https://goo.gl/forms/jdPWov8PCNPoXtbn2" target="_blank"><span class="glyphicon glyphicon-link"></span> Subhire Insurance Form</a>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -19,8 +19,7 @@
|
|||||||
<span class="glyphicon glyphicon-ban-circle"></span> <span
|
<span class="glyphicon glyphicon-ban-circle"></span> <span
|
||||||
class="hidden-xs">Void</span>
|
class="hidden-xs">Void</span>
|
||||||
</a>
|
</a>
|
||||||
<a href="{% url 'invoice_print' object.pk %}" target="_blank" title="Print Invoice"
|
<a href="{% url 'invoice_print' object.pk %}" target="_blank" title="Print Invoice" class="btn btn-default"><span
|
||||||
class="btn btn-default"><span
|
|
||||||
class="glyphicon glyphicon-print"></span> <span
|
class="glyphicon glyphicon-print"></span> <span
|
||||||
class="hidden-xs">Print</span></a>
|
class="hidden-xs">Print</span></a>
|
||||||
</div>
|
</div>
|
||||||
@@ -86,9 +85,7 @@
|
|||||||
<dd>
|
<dd>
|
||||||
{% if object.event.authorised %}
|
{% if object.event.authorised %}
|
||||||
{{ object.event.authorisation.name }}
|
{{ object.event.authorisation.name }}
|
||||||
(
|
(<a href="mailto:{{ object.event.authorisation.email }}">{{ object.event.authorisation.email }}</a>)
|
||||||
<a href="mailto:{{ object.event.authorisation.email }}">{{ object.event.authorisation.email }}</a>
|
|
||||||
)
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
@@ -143,7 +140,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for payment in object.payments.all %}
|
{% for payment in object.payment_set.all %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ payment.date }}</td>
|
<td>{{ payment.date }}</td>
|
||||||
<td>{{ payment.amount|floatformat:2 }}</td>
|
<td>{{ payment.amount|floatformat:2 }}</td>
|
||||||
@@ -175,13 +172,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-sm-12 text-right">
|
|
||||||
<div>
|
|
||||||
<a href="{% url 'invoice_history' object.pk %}" title="View Revision History">
|
|
||||||
Last edited at {{ object.last_edited_at }} by {{ object.last_edited_by.name }}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
15
RIGS/urls.py
@@ -1,12 +1,13 @@
|
|||||||
from django.conf.urls import url
|
from django.conf.urls import url
|
||||||
from django.contrib.auth.decorators import login_required
|
|
||||||
from django.contrib.auth.views import password_reset
|
from django.contrib.auth.views import password_reset
|
||||||
from django.views.decorators.clickjacking import xframe_options_exempt
|
|
||||||
from django.views.generic import RedirectView
|
|
||||||
|
|
||||||
from PyRIGS.decorators import api_key_required
|
from django.contrib.auth.decorators import login_required
|
||||||
from PyRIGS.decorators import permission_required_with_403
|
|
||||||
from RIGS import models, views, rigboard, finance, ical, versioning, forms
|
from RIGS import models, views, rigboard, finance, ical, versioning, forms
|
||||||
|
from django.views.generic import RedirectView
|
||||||
|
from django.views.decorators.clickjacking import xframe_options_exempt
|
||||||
|
|
||||||
|
from PyRIGS.decorators import permission_required_with_403
|
||||||
|
from PyRIGS.decorators import api_key_required
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
# Examples:
|
# Examples:
|
||||||
@@ -143,10 +144,6 @@ urlpatterns = [
|
|||||||
url(r'^invoice/(?P<pk>\d+)/delete/$',
|
url(r'^invoice/(?P<pk>\d+)/delete/$',
|
||||||
permission_required_with_403('RIGS.change_invoice')(finance.InvoiceDelete.as_view()),
|
permission_required_with_403('RIGS.change_invoice')(finance.InvoiceDelete.as_view()),
|
||||||
name='invoice_delete'),
|
name='invoice_delete'),
|
||||||
url(r'^invoice/(?P<pk>\d+)/history/$',
|
|
||||||
permission_required_with_403('RIGS.view_invoice')(versioning.VersionHistory.as_view()),
|
|
||||||
name='invoice_history', kwargs={'model': models.Invoice}),
|
|
||||||
|
|
||||||
url(r'^payment/create/$',
|
url(r'^payment/create/$',
|
||||||
permission_required_with_403('RIGS.add_payment')(finance.PaymentCreate.as_view()),
|
permission_required_with_403('RIGS.add_payment')(finance.PaymentCreate.as_view()),
|
||||||
name='payment_create'),
|
name='payment_create'),
|
||||||
|
|||||||
@@ -21,12 +21,12 @@ Pillow==5.1.0
|
|||||||
psycopg2==2.7.4
|
psycopg2==2.7.4
|
||||||
Pygments==2.2.0
|
Pygments==2.2.0
|
||||||
PyPDF2==1.26.0
|
PyPDF2==1.26.0
|
||||||
python-dateutil==2.7.2
|
python-dateutil==2.7.3
|
||||||
pytz==2018.4
|
pytz==2018.4
|
||||||
raven==6.7.0
|
raven==6.8.0
|
||||||
reportlab==3.4.0
|
reportlab==3.4.0
|
||||||
selenium==3.12.0
|
selenium==3.12.0
|
||||||
simplejson==3.14.0
|
simplejson==3.15.0
|
||||||
six==1.11.0
|
six==1.11.0
|
||||||
sqlparse==0.2.4
|
sqlparse==0.2.4
|
||||||
static3==0.7.0
|
static3==0.7.0
|
||||||
|
|||||||
@@ -17,11 +17,11 @@
|
|||||||
<form id="loginForm" action="" method="post" role="form" target="_self">{% csrf_token %}
|
<form id="loginForm" action="" method="post" role="form" target="_self">{% csrf_token %}
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="id_username">{{ form.username.label }}</label>
|
<label for="id_username">{{ form.username.label }}</label>
|
||||||
{% render_field form.username class+="form-control" placeholder=form.username.label %}
|
{{ form.username }}
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="{{ form.password.id_for_label }}">{{ form.password.label }}</label>
|
<label for="{{ form.password.id_for_label }}">{{ form.password.label }}</label>
|
||||||
{% render_field form.password class+="form-control" placeholder=form.password.label %}
|
{{ form.password }}
|
||||||
</div>
|
</div>
|
||||||
<div class="text-right">
|
<div class="text-right">
|
||||||
<input type="submit" value="Login" class="btn btn-primary"/>
|
<input type="submit" value="Login" class="btn btn-primary"/>
|
||||||
|
|||||||