Browse Source

Merge fix-requirements fix-misc-stuff-in-csv-import

ljf 7 years ago
parent
commit
56a884a963

+ 24 - 8
coin/billing/management/commands/import_payments_from_csv.py

@@ -27,6 +27,8 @@ import logging
 import os
 import re
 
+import unidecode
+
 # Django specific imports
 from argparse import RawTextHelpFormatter
 from django.core.management.base import BaseCommand, CommandError
@@ -189,13 +191,14 @@ class Command(BaseCommand):
 
     def try_to_match_payment_with_members(self, payments):
 
-        members = Member.objects.filter(status="member")
+        #members = Member.objects.filter(status="member")
+        members = Member.objects.all()
 
         idregex = re.compile(ID_REGEX)
 
         for payment in payments:
 
-            payment_label = payment["label"]
+            payment_label = payment["label"].upper()
 
             # First, attempt to match the member ID
             idmatches = idregex.findall(payment_label)
@@ -211,11 +214,14 @@ class Command(BaseCommand):
             # Second, attempt to find the username
             usernamematch = None
             for member in members:
-                matches = re.compile(r"(?i)(\b|_)"+re.escape(member.username)+r"(\b|_)") \
+                username = self.flatten(member.username)
+                matches = re.compile(r"(?i)(\b|_)"+re.escape(username)+r"(\b|_)") \
                             .findall(payment_label)
+
                 # If not found, try next
                 if len(matches) == 0:
                     continue
+
                 # If we already had a match, abort the whole search because we
                 # have multiple usernames matched !
                 if usernamematch != None:
@@ -236,22 +242,30 @@ class Command(BaseCommand):
                 if member.last_name == "":
                     continue
 
-                matches = re.compile(r"(?i)(\b|_)"+re.escape(str(member.last_name))+r"(\b|_)") \
+                # "Flatten" accents in the last name... (probably the CSV
+                # don't contain 'special' chars like accents
+                member_last_name = self.flatten(member.last_name)
+
+                matches = re.compile(r"(?i)(\b|_)"+re.escape(member_last_name)+r"(\b|_)") \
                             .findall(payment_label)
+
                 # If not found, try next
                 if len(matches) == 0:
                     continue
+
                 # If this familyname was matched several time, abort the whole search
-                if len(matches) > 1:
-                    familynamematch = None
-                    break
+                #if len(matches) > 1:
+                #    print("Several matches ! Aborting !")
+                #    familynamematch = None
+                #    break
+
                 # If we already had a match, abort the whole search because we
                 # have multiple familynames matched !
                 if familynamematch != None:
                     familynamematch = None
                     break
 
-                familynamematch = str(member.last_name)
+                familynamematch = member_last_name
                 usernamematch = str(member.username)
 
             if familynamematch != None:
@@ -336,3 +350,5 @@ class Command(BaseCommand):
                                              date=new_payment["date"],
                                              member=member)
 
+    def flatten(self, some_string):
+        return unidecode.unidecode(some_string).upper()

+ 7 - 7
coin/billing/models.py

@@ -367,7 +367,7 @@ class Payment(models.Model):
                                     default='transfer',
                                     choices=PAYMENT_MEAN_CHOICES,
                                     verbose_name='moyen de paiement')
-    amount = models.DecimalField(max_digits=5, decimal_places=2, null=True,
+    amount = models.DecimalField(max_digits=6, decimal_places=2, null=True,
                                  verbose_name='montant')
     date = models.DateField(default=datetime.date.today)
     invoice = models.ForeignKey(Invoice, verbose_name='facture associée', null=True,
@@ -485,9 +485,9 @@ def update_accounting_for_member(member):
     """
 
     accounting_log.info("Updating accounting for member %s ..."
-                        % str(member))
+                        % member)
     accounting_log.info("Member %s current balance is %f ..."
-                        % (str(member), float(member.balance)))
+                        % (member, float(member.balance)))
 
     reconcile_invoices_and_payments(member)
 
@@ -499,7 +499,7 @@ def update_accounting_for_member(member):
     member.save()
 
     accounting_log.info("Member %s new balance is %f"
-                        % (str(member),  float(member.balance)))
+                        % (member,  float(member.balance)))
 
 
 def reconcile_invoices_and_payments(member):
@@ -513,16 +513,16 @@ def reconcile_invoices_and_payments(member):
     if active_payments == []:
         accounting_log.info("(No active payment for %s. No invoice/payment "
                             "reconciliation needed.)."
-                            % str(member))
+                            % member)
         return
     elif active_invoices == []:
         accounting_log.info("(No active invoice for %s. No invoice/payment "
                             "reconciliation needed.)."
-                            % str(member))
+                            % member)
         return
 
     accounting_log.info("Initiating reconciliation between "
-                        "invoice and payments for %s" % str(member))
+                        "invoice and payments for %s" % member)
 
     while active_payments != [] and active_invoices != []:
 

+ 2 - 1
coin/members/models.py

@@ -111,7 +111,8 @@ class Member(CoinLdapSyncMixin, AbstractUser):
     send_membership_fees_email = models.BooleanField(
         default=True, verbose_name='relance de cotisation',
         help_text='Précise si l\'utilisateur doit recevoir des mails de relance pour la cotisation. Certains membres n\'ont pas à recevoir de relance (prélèvement automatique, membres d\'honneurs, etc.)')
-    balance = models.DecimalField(max_digits=5, decimal_places=2, default=0,
+
+    balance = models.DecimalField(max_digits=6, decimal_places=2, default=0,
                                   verbose_name='account balance')
 
     objects = MemberManager()

+ 5 - 3
requirements.txt

@@ -1,5 +1,5 @@
 Django>=1.8.17,<1.9
-psycopg2==2.5.2
+psycopg2==2.5.4
 python-ldap==2.4.15
 wsgiref==0.1.2
 python-dateutil==2.2
@@ -10,10 +10,12 @@ django-polymorphic==0.7.2
 django-sendfile==0.3.10
 django-localflavor==1.1
 django-netfields>=0.4,<0.5
-django-ldapdb>=0.4.0,<5.0
+django-ldapdb>=0.4.0,<0.5.0
 django-multiselectfield>=0.1.5
 feedparser
 six==1.10.0
 WeasyPrint==0.31
 freezegun==0.3.8
-django-registration==2.2
+django-registration>=2.4,<2.5
+pyldap<3.0
+unidecode