py3ification

master
Kasownik 2020-10-12 18:11:50 +02:00
parent 35405b4909
commit 0e1998c31e
8 changed files with 38 additions and 20 deletions

View File

@ -28,7 +28,7 @@ MarkupSafe==1.1.0
mccabe==0.6.1
oauthlib==2.0.7
prometheus-client==0.1.1
psycopg2==2.5.4
psycopg2==2.8.6
prometheus-flask-exporter==0.8.0
pylint==1.8.2
python-ldap

View File

@ -29,6 +29,9 @@ import memcache
import requests
import sqltap.wsgi
import click
import json
import decimal
import datetime
from flask import Flask, redirect
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, AnonymousUserMixin, login_required, current_user
@ -67,6 +70,18 @@ def admin_required(func):
return wrapper
class DecimalEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, decimal.Decimal):
# wanted a simple yield str(o) in the next line,
# but that would mean a yield on the line with super(...),
# which wouldn't work (see my comment below), so...
return str(o)
#return (str(o) for o in [o])
elif isinstance(o, datetime.datetime):
return str(o)
#return (str(o) for o in [o])
return super(DecimalEncoder, self).default(o)
def create_app():
@ -116,4 +131,6 @@ def create_app():
import webapp.commands
app.cli.commands.update(webapp.commands.group.commands)
app.json_encoder = DecimalEncoder
return app

View File

@ -9,8 +9,8 @@ from flask import render_template, request, flash, g, Response, \
from flask_login import login_required
from webapp import forms, db, models, admin_required
import directory
import logic
from . import directory
from . import logic
bp = Blueprint('admin', __name__)
@ -247,7 +247,7 @@ def sendspam():
payment_policy=models.PaymentPolicy.normal.value).all()
members = [(m, m.get_status()) for m in members]
members.sort(key=lambda (m, s): -(s['months_due'] or 0))
members.sort(key=lambda m, s: -(s['months_due'] or 0))
form = forms.SpamForm()
form.members.choices = [(member.id, member) for member, status in members if status['months_due'] or status['judgement']]

View File

@ -4,8 +4,8 @@ from flask import g
from flask.cli import AppGroup
from webapp import models, db
import directory
import logic
from . import directory
from . import logic
group = AppGroup(__name__)

View File

@ -52,7 +52,7 @@ def _destroy_ldap(exception=None):
def get_ldap_group_diff(members):
active_members = filter(lambda m: m['judgement'], members)
active_members = list(filter(lambda m: m['judgement'], members))
fatty = set([member['username'] for member in active_members if member['type'] in ['fatty', 'supporting']])
starving = set([member['username'] for member in active_members if member['type'] in ['starving']])
@ -86,10 +86,10 @@ def update_member_groups(c, changes):
continue
values = []
for username in target_members:
values.append('uid={},{}'.format(username.encode('utf-8'),app.config['LDAP_USER_BASE']))
values.append('uid={},{}'.format(username,app.config['LDAP_USER_BASE']).encode('utf-8'))
modlist = [(ldap.MOD_REPLACE,'uniqueMember',values)]
#print group,modlist
c.modify_s('cn={},{}'.format(group.encode('utf-8'),app.config['LDAP_GROUP_BASE']), modlist)
c.modify_s('cn={},{}'.format(group,app.config['LDAP_GROUP_BASE']), modlist)
# keeping it here instead of git history because it's preferable to the other method, as long as LDAP stops crashing
def update_member_groups_fucked(c, changes):
@ -102,7 +102,7 @@ def update_member_groups_fucked(c, changes):
values.append('uid={},{}'.format(username.encode('utf-8'),app.config['LDAP_USER_BASE']))
if values:
modlist.append((ops[op],'uniqueMember',values))
print group, modlist
#print group, modlist
c.modify_s('cn={},{}'.format(group.encode('utf-8'),app.config['LDAP_GROUP_BASE']), modlist)
def get_group_members(c, group):
@ -115,13 +115,13 @@ def get_group_members(c, group):
members = []
for dn, obj in data:
for k, v in obj.iteritems():
for k, v in obj.items():
if k == "uniqueMember":
for iv in v:
part,uid,index = ldap.dn.str2dn(iv)[0][0]
if not part == 'uid' or not index == 1:
raise ValueError("First part type {} or index {} seem wrong for DN {}".format(part,index,iv))
members.append(uid.decode('utf-8'))
members.append(uid)
return members
def get_member_fields(c, member, fields):
@ -146,7 +146,7 @@ def get_member_fields(c, member, fields):
data = c.search_s(app.config['LDAP_USER_BASE'], ldap.SCOPE_SUBTREE,
lfilter, tuple(fields))
for dn, obj in data:
for k, v in obj.iteritems():
for k, v in obj.items():
v = v[0].decode('utf-8')
if k in fields_needed:
fields_out[k] = v

View File

@ -25,7 +25,7 @@
"""The 'business' logic of the whole thing."""
from webapp import app, db
import models
from . import models
def get_unmatched_transfers():
return models.Transfer.query.filter_by(member_transfers=None,ignore=False) \
@ -41,7 +41,7 @@ def try_automatch(transfers):
if member.transfers:
year, month = member.get_next_unpaid()
if None in (year, month):
print "[w] next_unpaid borked, skipping"
print("[w] next_unpaid borked, skipping")
continue
else:
year, month = transfer.date.year, transfer.date.month

View File

@ -36,7 +36,7 @@ from sqlalchemy.sql.expression import or_
from flask import g
from webapp import app, db, cache, cache_enabled
import directory
from . import directory
@ -381,7 +381,8 @@ 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())
print(repr(self.title.strip().lower()))
m = re.match(r"^([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)
@ -408,10 +409,10 @@ class Transfer(db.Model):
return self.MATCH_WRONG_TYPE, member, 0
if title[1] == 'starving' and self.amount >= (50*100) and (self.amount % (50*100)) == 0:
return self.MATCH_OK, member, (self.amount/(50*100))
return self.MATCH_OK, member, int(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_OK, member, int(self.amount/(100*100))
return self.MATCH_WRONG_TYPE, member, 0

View File

@ -31,7 +31,7 @@ from flask import Response, request, redirect, flash, render_template, url_for,
from flask_login import login_user, login_required, logout_user, current_user
from webapp import app, forms, User, models, cache, db
import directory
from . import directory
@app.route('/')
def stats():