Browse Source

Add skeleton of view / mechanism to import the CSV

Alexandre Aubin 6 years ago
parent
commit
f865ba43dd

+ 60 - 1
coin/billing/admin.py

@@ -7,13 +7,15 @@ from django.http import HttpResponseRedirect
 from django.conf.urls import url
 from django.contrib.admin.utils import flatten_fieldsets
 from django import forms
+from django.template import RequestContext
+from django.shortcuts import render
 
 from coin.filtering_queryset import LimitedAdminInlineMixin
 from coin.billing.models import Invoice, InvoiceDetail, Payment, PaymentAllocation
 from coin.billing.utils import get_invoice_from_id_or_number
 from django.core.urlresolvers import reverse
 import autocomplete_light
-
+from functools import update_wrapper
 
 class InvoiceDetailInlineForm(forms.ModelForm):
     class Meta:
@@ -238,5 +240,62 @@ class PaymentAdmin(admin.ModelAdmin):
     def get_inline_instances(self, request, obj=None):
         return [PaymentAllocationInlineReadOnly(self.model, self.admin_site)]
 
+    def get_urls(self):
+        def wrap(view):
+            def wrapper(*args, **kwargs):
+                return self.admin_site.admin_view(view)(*args, **kwargs)
+            wrapper.model_admin = self
+            return update_wrapper(wrapper, view)
+
+        urls = super(PaymentAdmin, self).get_urls()
+
+        info = self.model._meta.app_label, self.model._meta.model_name
+
+        print(urls)
+
+        my_urls = [
+            url(r'wizard_import_payment_csv/$', wrap(self.wizard_import_payment_csv), name='wizard_import_payment_csv'),
+        ]
+
+        print(my_urls)
+
+        return my_urls + urls
+
+
+    def wizard_import_payment_csv(self, request):
+        template = "admin/billing/payment/wizard_import_payment_csv.html"
+
+        from .forms import WizardImportPaymentCSV
+
+        if request.method == 'POST':
+            form = WizardImportPaymentCSV(request.POST, request.FILES)
+            if form.is_valid():
+                form.analyze_CSV()
+                return HttpResponseRedirect('/success/url/')
+        else:
+            form = WizardImportPaymentCSV()
+
+        return render(request, template, {
+            'adminform': form,
+            }, context_instance=RequestContext(request))
+
+
+class MembershipFeeAdmin(admin.ModelAdmin):
+    list_display = ('member', 'end_date', '_amount')
+    form = autocomplete_light.modelform_factory(MembershipFee, fields='__all__')
+
+
+class DonationAdmin(admin.ModelAdmin):
+    list_display = ('member', 'date', '_amount')
+    form = autocomplete_light.modelform_factory(MembershipFee, fields='__all__')
+
+class MembershipFeeInline(admin.TabularInline):
+    model = MembershipFee
+    extra = 0
+    fields = ('start_date', 'end_date', '_amount')
+
+MemberAdmin.list_filter += ('status', MembershipFeeFilter)
+MemberAdmin.inlines += [MembershipFeeInline]
+
 admin.site.register(Invoice, InvoiceAdmin)
 admin.site.register(Payment, PaymentAdmin)

+ 21 - 0
coin/billing/forms.py

@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+import os
+
+from django.core.exceptions import ValidationError
+from django import forms
+
+def validate_file_extension(value):
+    ext = os.path.splitext(value.name)[1]
+    valid_extensions = ['.csv']
+    if not ext.lower() in valid_extensions:
+        raise ValidationError(u'Unsupported file extension.')
+
+class WizardImportPaymentCSV(forms.Form):
+
+    csv_file = forms.FileField(validators=[validate_file_extension])
+
+
+    def analyze_CSV(self):
+        import pdb; pdb.set_trace()

+ 5 - 0
coin/billing/templates/admin/billing/payment/change_list.html

@@ -0,0 +1,5 @@
+{% extends "admin/change_list.html" %}
+{% block object-tools-items %}
+    <li><a href="./wizard_import_payment_csv">Importer des paiements</a></li>
+{% endblock %}
+ 

+ 14 - 0
coin/billing/templates/admin/billing/payment/wizard_import_payment_csv.html

@@ -0,0 +1,14 @@
+{% extends "admin/change_form.html" %}
+
+{% block content %}
+<h1>Import payments from a CSV</h1>
+<div id="content-main">
+    <form method="POST" action="."  enctype="multipart/form-data">
+        {% csrf_token %}
+        <fieldset class="module aligned wide" style="text-align:center;">
+            {{ adminform.as_p }}
+            <input type="submit" value="Analyze" class="default" style="float: none; margin:0 auto;"/>
+        </fieldset>
+    </form>
+</div>
+{% endblock %}