Updated automatic matching - will now match multiple month payments, matching will invalidate cache

master
Kasownik 2017-03-03 00:47:41 +01:00
parent 14ab58f38a
commit 53eab4533f
2 changed files with 26 additions and 17 deletions

View File

@ -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

View File

@ -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()