Updated automatic matching - will now match multiple month payments, matching will invalidate cache
parent
14ab58f38a
commit
53eab4533f
|
@ -250,6 +250,9 @@ class Member(db.Model):
|
|||
else:
|
||||
return '{}@hackerspace.pl'.format(self.username)
|
||||
|
||||
def invalidate_cache(self):
|
||||
cache_key = 'kasownik-payment_status-{}'.format(self.username)
|
||||
mc.delete(cache_key)
|
||||
|
||||
def get_status(self):
|
||||
"""It's better to call this after doing a full select of data."""
|
||||
|
@ -330,7 +333,7 @@ class Transfer(db.Model):
|
|||
return self.uid[:16]
|
||||
|
||||
def parse_title(self):
|
||||
m = re.match(ur"^([a-z0-9\-_\.]+) *\- *(fatty|starving|superfatty|supporting|supporter) *\- *([0-9a-z\-_ąężźćóżłśń \(\),/\.]+$)", self.title.strip().lower())
|
||||
m = re.match(ur"^([a-z0-9ąężźćóżłśń\-_\.]+) *\- *(fatty|starving|superfatty|supporting|supporter) *\- *([0-9a-z\-_ąężźćóżłśń \(\),/\.]+$)", self.title.strip().lower())
|
||||
if not m:
|
||||
return (None, None, None)
|
||||
member, _type, title = m.group(1), m.group(2), m.group(3)
|
||||
|
@ -343,16 +346,19 @@ class Transfer(db.Model):
|
|||
title = self.parse_title()
|
||||
if not title[0]:
|
||||
return self.MATCH_UNPARSEABLE, self.title
|
||||
|
||||
member_name = title[0]
|
||||
member = Member.query.filter_by(username=member_name).first()
|
||||
member = Member.query.filter(or_(Member.username==member_name, Member.alias==member_name)).first()
|
||||
if not member:
|
||||
return self.MATCH_NO_USER, member_name
|
||||
|
||||
if (title[1] == 'starving' and self.amount > 50) or (title[1] == 'fatty' and self.amount > 100):
|
||||
return self.MATCH_WRONG_TYPE, member
|
||||
|
||||
return self.MATCH_NO_USER, member_name, 0
|
||||
|
||||
if title[2]:
|
||||
return self.MATCH_WRONG_TYPE, member
|
||||
return self.MATCH_WRONG_TYPE, member, 0
|
||||
|
||||
return self.MATCH_OK, member
|
||||
if title[1] == 'starving' and self.amount >= (50*100) and (self.amount % (50*100)) == 0:
|
||||
return self.MATCH_OK, member, (self.amount/(50*100))
|
||||
|
||||
if title[1] == 'fatty' and self.amount >= (100*100) and (self.amount % (100*100)) == 0:
|
||||
return self.MATCH_OK, member, (self.amount/(100*100))
|
||||
|
||||
|
||||
return self.MATCH_WRONG_TYPE, member, 0
|
||||
|
|
|
@ -34,11 +34,11 @@ from subprocess import Popen, PIPE
|
|||
|
||||
from webapp import app, forms, User, db, models, mc, cache_enabled, admin_required
|
||||
from flask.ext.login import login_user, login_required, logout_user, current_user
|
||||
from flask import request, redirect, flash, render_template, url_for, abort, g
|
||||
from flask import Response, request, redirect, flash, render_template, url_for, abort, g
|
||||
import banking
|
||||
import logic
|
||||
import directory
|
||||
|
||||
import traceback
|
||||
|
||||
@app.route('/')
|
||||
def stats():
|
||||
|
@ -223,17 +223,20 @@ def admin_match_auto():
|
|||
left = 0
|
||||
transfers_unmatched = logic.get_unmatched_transfers()
|
||||
for transfer in transfers_unmatched:
|
||||
matchability, extra = transfer.get_matchability()
|
||||
matchability, member, months = transfer.get_matchability()
|
||||
if matchability == models.Transfer.MATCH_OK:
|
||||
member = extra
|
||||
if len(member.transfers) > 0:
|
||||
year, month = member.get_next_unpaid()
|
||||
else:
|
||||
year, month = transfer.date.year, transfer.date.month
|
||||
mt = models.MemberTransfer(None, year, month, transfer)
|
||||
member.transfers.append(mt)
|
||||
db.session.add(mt)
|
||||
for m in range(months):
|
||||
mt = models.MemberTransfer(None, year, month, transfer)
|
||||
member.transfers.append(mt)
|
||||
db.session.add(mt)
|
||||
flash("Matched transfer {} to member {} for month {}-{}".format(transfer.id, member.username, year, month))
|
||||
year, month = member._yearmonth_increment((year,month))
|
||||
matched += 1
|
||||
member.invalidate_cache()
|
||||
else:
|
||||
left += 1
|
||||
db.session.commit()
|
||||
|
|
Loading…
Reference in New Issue