def expire_members(): types = MemberType.all().fetch(30) expired_type = None for mt in types: if mt.name == MEMBER_TYPE_EXPIRED: expired_type = mt break if not expired_type: print 'Could not find member type for expired members' members = Member.all().fetch(3000) expired_count = 0 last_year = datetime.datetime.now().year - 1 for member in members: dues = MembershipDues.all().ancestor(member).fetch(30) all_paid = False for due in dues: if due.year >= last_year and due.paid: all_paid = True break if not all_paid and member.membertype.name == DEFAULT_MEMBER_NAME and member.status.name == DEFAULT_MEMBER_STATUS_NAME: print 'Member no', member.number, 'has an expired membership' member.membertype = expired_type member.put() expired_count = expired_count + 1 print expired_count, 'memberships have been ended'
def report_task(self): diff = datetime.timedelta(days=150) cutoff_date = datetime.date.today() - diff filename = self.get_filename(self.id()) member_list = Member.all().fetch(LIMIT_ALL) lines = list() lines.append("number;name;zip;city;date;bil\n") for member in member_list: if member.member_since >= cutoff_date and member.status.name == "Medlem": cars = member.cars.fetch(1) if len(cars) > 0: model = cars[0].model.name else: model = "" lines.append( '"%s";"%s";"%s";"%s";"%s";"%s"\n' % ( unicode(member.number), unicode(member.name), unicode(member.zipcode), unicode(member.city), member.member_since.isoformat(), model, ) ) self.write_report(filename, lines)
def nonone(): """ Mass update fields set to 'None'. Please don't ask. """ for member in Member.all().fetch(10000): mod = False if member.email == 'None': member.email = None mod = True if member.phone == 'None': member.phone = None mod = True if member.phone_work == 'None': member.phone_work = None mod = True if member.phone_home == 'None': member.phone_home = None mod = True if member.address == 'None': member.address = None mod = True if mod: member.put()
def nonone(self): """ Mass update fields set to 'None'. Please don't ask. """ for member in Member.all().fetch(3000): mod = False if member.email == 'None': member.email = None mod = True if member.phone == 'None': member.phone = None mod = True if member.phone_work == 'None': member.phone_work = None mod = True if member.phone_home == 'None': member.phone_home = None mod = True if member.address == 'None': member.address = None mod = True if mod: member.put()
def create_new_member_no(): """Assign new member no. Not *that* time critical but some form of transactions would be nice. Or required. This makes my hair stand up but... It works.""" members = Member.all().order('-number').fetch(1) return str(int(members[0].number) + 1)
def do_index_verification(): member_list = Member.all().fetch(LIMIT_ALL) index = search.Index(name='members') for member in member_list: query = result = index.search(query=search.Query('number:' + member.number, options=search.QueryOptions(limit=10))) logging.debug('Found ' + str(len(result))) + ' members with number ' + member.number
def create_index(self): print 'Creating member index' members = Member.all().fetch(10000) docs = [] for member in members: print 'Indexing member',member.number docs.append(member.create_document()) if len(docs) > 100: index = search.Index(name='members') index.put(docs) docs = []
def create_index(self): print 'Creating member index' members = Member.all().fetch(10000) docs = [] for member in members: print 'Indexing member', member.number docs.append(member.create_document()) if len(docs) > 100: index = search.Index(name='members') index.put(docs) docs = []
def create_member_car(self, car, range_name, model_name, note): members = Member.all().filter('number', car.memberno).fetch(10) if len(members) == 0: print 'WARNING: Could not look up member with no.', car.memberno return member_car = Car() member_car.member = members[0] member_car.model = self.get_model(model_name) member_car.registration = car.registration member_car.year = int(car.year) member_car.notes = note member_car.serial_no = '' member_car.put()
def create_member_car(self, car, range_name, model_name, note): members = Member.all().filter('number',car.memberno).fetch(10) if len(members) == 0: print 'WARNING: Could not look up member with no.',car.memberno return member_car = Car() member_car.member = members[0] member_car.model = self.get_model(model_name) member_car.registration = car.registration member_car.year = int(car.year) member_car.notes = note member_car.serial_no = '' member_car.put()
def report_task(self): filename = self.get_filename(self.id()) member_list = Member.all().fetch(LIMIT_ALL) lines = list() lines.append('number;name;address;zip;city;country;type\n') for member in member_list: typename = member.membertype.name if typename == u'Medlem' or typename == u'Hedersmedlem': lines.append('"%s";"%s";"%s";"%s";"%s";"%s";"%s"\n' % ( unicode(member.number), unicode(member.name), unicode(member.address), unicode(member.zipcode), unicode(member.city), unicode(member.country.name), typename)) self.write_report(filename, lines, 'cp1252')
def index_verification(self): logging.info('Retrieving member list') member_list = Member.all().fetch(10000) logging.info('Found ' + str(len(member_list)) + ' members') index = search.Index(name='members') for member in member_list: try: result = index.search(query=search.Query('number:' + member.number, options=search.QueryOptions(limit=10))) if not result.results: logging.warning('Found no entry for member with number ' + member.number + '. Adding to index') member.update_index() except ex: logging.warning('Got exception ex ' + ex) logging.info('Completed verification')
def report_task(self): filename = self.get_filename(self.id()) member_list = Member.all().fetch(LIMIT_ALL) lines = list() lines.append('number;name;address;zip;city;country;edit_code;fee;type;magazine_count\n') for member in member_list: typename = member.membertype.name count = (member.magazine_count if member.magazine_count else 1) if typename == u'Medlem' or \ typename == u'Alfanytt' or typename == u'Hedersmedlem': lines.append('"%s";"%s";"%s";"%s";"%s";"%s";"%s";%d;"%s";%d\n' % ( unicode(member.number), unicode(member.name), unicode(member.address), unicode(member.zipcode), unicode(member.city), unicode(member.country.name), unicode(member.edit_access_code), member.membertype.fee, typename, count)) self.write_report(filename, lines, 'cp1252')
def report_task(self): filename = self.get_filename(self.id()) member_list = Member.all().fetch(LIMIT_ALL) current_year = datetime.datetime.now().year final_list = list() for member in member_list: # Skip if the member doesn't pay fees if member.membertype.fee == 0: continue # Retrieve dues and check if status is set to paid dues = MembershipDues.all().ancestor(member).fetch(YEAR_MAX) paid = False for due in dues: if due.year == current_year: paid = due.paid break if not paid: final_list.append(member) # Make CSV file lines = list() lines.append( 'number;name;address;zip;city;country;email;phone;member_since;type;status\n' ) for member in final_list: datestr = '' if member.member_since: datestr = member.member_since.strftime('%Y-%m-%d') phonestr = '' if member.phone and member.phone != 'None': phonestr = unicode(member.phone) emailstr = '' if member.email and member.email != 'None': emailstr = unicode(member.email) lines.append( '"%s";"%s";"%s";"%s";"%s";"%s";"%s";"%s";%s;"%s";"%s"\n' % (unicode(member.number), unicode(member.name), unicode(member.address), unicode(member.zipcode), unicode(member.city), unicode( member.country.name), emailstr, phonestr, datestr, unicode(member.membertype.name), unicode(member.status.name))) self.write_report(filename, lines)
def index_verification(self): logging.info('Retrieving member list') member_list = Member.all().fetch(10000) logging.info('Found ' + str(len(member_list)) + ' members') index = search.Index(name='members') for member in member_list: try: result = index.search( query=search.Query('number:' + member.number, options=search.QueryOptions(limit=10))) if not result.results: logging.warning('Found no entry for member with number ' + member.number + '. Adding to index') member.update_index() except ex: logging.warning('Got exception ex ' + ex) logging.info('Completed verification')
def report_task(self): filename = self.get_filename(self.id()) member_list = Member.all().fetch(LIMIT_ALL) lines = list() lines.append('number;name;address;zip;city;country;edit_code;fee;type\n') for member in member_list: typename = member.membertype.name if typename == u'Medlem' or \ typename == u'Alfanytt' or typename == u'Hedersmedlem': count = (member.magazine_count if member.magazine_count else 1) for n in range(0, count): lines.append('"%s";"%s";"%s";"%s";"%s";"%s";"%s";%d;"%s"\n' % ( unicode(member.number), unicode(member.name), unicode(member.address), unicode(member.zipcode), unicode(member.city), unicode(member.country.name), unicode(member.edit_access_code), member.membertype.fee, typename)) self.write_report(filename, lines, 'cp1252')
def report_task(self): filename = self.get_filename(self.id()) member_list = Member.all().fetch(LIMIT_ALL) current_year = datetime.datetime.now().year final_list = list() for member in member_list: # Skip if the member doesn't pay fees if member.membertype.fee == 0: continue # Retrieve dues and check if status is set to paid dues = MembershipDues.all().ancestor(member).fetch(YEAR_MAX) paid = False for due in dues: if due.year == current_year: paid = due.paid break if not paid: final_list.append(member) # Make CSV file lines = list() lines.append( 'number;name;address;zip;city;country;email;phone;member_since;type;status\n') for member in final_list: datestr = '' if member.member_since: datestr = member.member_since.strftime('%Y-%m-%d') phonestr = '' if member.phone and member.phone != 'None': phonestr = unicode(member.phone) emailstr = '' if member.email and member.email != 'None': emailstr = unicode(member.email) lines.append('"%s";"%s";"%s";"%s";"%s";"%s";"%s";"%s";%s;"%s";"%s"\n' % ( unicode(member.number), unicode( member.name), unicode(member.address), unicode(member.zipcode), unicode( member.city), unicode(member.country.name), emailstr, phonestr, datestr, unicode(member.membertype.name), unicode(member.status.name))) self.write_report(filename, lines)
def report_task(self): filename = self.get_filename(self.id()) member_list = Member.all().fetch(LIMIT_ALL) current_year = datetime.datetime.now().year year_range = range(current_year - 3, current_year + 3) lines = list() lines.append('number;name;address;zip;city;country;type;email;phone') for year in year_range: lines.append(';fee' + str(year)) lines.append('\n') for member in member_list: typename = member.membertype.name emailstr = '' if member.email and member.email != 'None': emailstr = unicode(member.email) phonestr = '' if member.phone and member.phone != 'None': phonestr = unicode(member.phone) lines.append('"%s";"%s";"%s";"%s";"%s";"%s";"%s";"%s";"%s"' % (unicode(member.number), unicode(member.name), unicode(member.address), unicode(member.zipcode), unicode(member.city), unicode(member.country.name), typename, emailstr, phonestr)) due_list = {} for year in year_range: due_list['year' + str(year)] = 0 for due in MembershipDues.all().ancestor(member).fetch(YEAR_MAX): key = 'year' + str(due.year) if key in due_list: if due.paid: due_list[key] = 1 for year in year_range: lines.append(';' + str(due_list['year' + str(year)])) lines.append('\n') self.write_report(filename, lines, 'cp1252')
def create_index(self): """Create a new index""" members = Member.all().fetch(20000) docs = [] count = 0 for member in members: try: docs.append(member.create_document()) if len(docs) > 100: index = search.Index(name='members') index.put(docs) docs = [] count = count + 1 except Exception as ex: logging.warning('Got exception ex %s', ex) if len(docs) > 0: index = search.Index(name='members') index.put(docs) docs = [] logging.info('Reindexed %d members', count)
def expire_members(): logging.info('Expiring memberships') types = MemberType.all().fetch(10000) expired_type = None for mt in types: if mt.name == MEMBER_TYPE_EXPIRED: expired_type = mt break if not expired_type: logging.info( 'Could not find member type for expired members. Exiting.') return members = Member.all().fetch(10000) expired_count = 0 this_year = datetime.datetime.now().year total = 0 for member in members: total = total + 1 dues = MembershipDues.all().ancestor(member).filter( 'year', this_year).fetch(100) all_paid = False for due in dues: #logging.info('%s: Y: %s, paid: %s' % (member.number, due.year, due.paid)) if not all_paid and due.year == this_year and due.paid: all_paid = True # print 'All paid for %s ' % (member.number) if not all_paid: if member.membertype.name == DEFAULT_MEMBER_NAME: if member.status.name == DEFAULT_MEMBER_STATUS_NAME: print( 'Member no %s has an expired membership (type is %s, status is %s); new type will be %s' % (member.number, member.membertype.name, member.status.name, expired_type.name)) member.membertype = expired_type member.put() expired_count = expired_count + 1 print('%d memberships of %d will be expired' % (expired_count, total))
def report_task(self): diff = datetime.timedelta(days=150) cutoff_date = datetime.date.today() - diff filename = self.get_filename(self.id()) member_list = Member.all().fetch(LIMIT_ALL) lines = list() lines.append('number;name;zip;city;date;bil\n') for member in member_list: if member.member_since >= cutoff_date and member.status.name == 'Medlem': cars = member.cars.fetch(1) if cars: model = cars[0].model.name else: model = '' lines.append('"%s";"%s";"%s";"%s";"%s";"%s"\n' % (unicode(member.number), unicode(member.name), unicode(member.zipcode), unicode(member.city), member.member_since.isoformat(), model)) self.write_report(filename, lines)
def post(self): # User (tries to) log in. Check member no and access code. try: memberno = self.get_required('memberno') access_code = self.get_required('accesscode') members = Member.all().filter('number', memberno).fetch(1) if len (members) < 1: self.abort(400) if members[0].edit_access_code.lower() != access_code: self.abort(400) self.create_cookie(memberno, access_code) return self.redirect('profile/' + str(members[0].key()) + '/edit') except Exception as ex: print 'Got exception:',ex # bounce to login page self.response.delete_cookie(COOKIE_NAME) return self.redirect('profile')
def report_task(self): filename = self.get_filename(self.id()) member_list = Member.all().fetch(LIMIT_ALL) current_year = datetime.datetime.now().year year_range = range(current_year - 3, current_year + 3) lines = list() lines.append('number;name;address;zip;city;country;type;email') for year in year_range: lines.append(';fee' + str(year)) lines.append('\n') for member in member_list: typename = member.membertype.name emailstr = '' if member.email and member.email != 'None': emailstr = unicode(member.email) lines.append('"%s";"%s";"%s";"%s";"%s";"%s";"%s";"%s"' % ( unicode(member.number), unicode(member.name), unicode(member.address), unicode(member.zipcode), unicode(member.city), unicode(member.country.name), typename, emailstr)) due_list = {} for year in year_range: due_list['year' + str(year)] = 0 for due in MembershipDues.all().ancestor(member).fetch(YEAR_MAX): key = 'year' + str(due.year) if key in due_list: if due.paid: due_list[key] = 1 for year in year_range: lines.append(';' + str(due_list['year' + str(year)])) lines.append('\n') self.write_report(filename, lines, 'cp1252')
def expire_members(): logging.info('Expiring memberships') types = MemberType.all().fetch(10000) expired_type = None for mt in types: if mt.name == MEMBER_TYPE_EXPIRED: expired_type = mt break if not expired_type: logging.info( 'Could not find member type for expired members. Exiting.') return members = Member.all().fetch(10000) expired_count = 0 this_year = datetime.datetime.now().year total = 0 for member in members: total = total + 1 dues = MembershipDues.all().ancestor(member).filter('year', this_year).fetch(100) all_paid = False for due in dues: #logging.info('%s: Y: %s, paid: %s' % (member.number, due.year, due.paid)) if not all_paid and due.year == this_year and due.paid: all_paid = True # print 'All paid for %s ' % (member.number) if not all_paid: if member.membertype.name == DEFAULT_MEMBER_NAME: if member.status.name == DEFAULT_MEMBER_STATUS_NAME: print ('Member no %s has an expired membership (type is %s, status is %s); new type will be %s' % (member.number, member.membertype.name, member.status.name, expired_type.name)) member.membertype = expired_type member.put() expired_count = expired_count + 1 print ('%d memberships of %d will be expired' % (expired_count, total))
def post(self): complete = [] incomplete = [] values = {} # Holy crap this is ugly. There has to be a better way. name = self.request.get('name') if not name or name.strip() == '' or name.strip().startswith('http'): incomplete.append('name') else: values['name'] = name complete.append('name') address = self.request.get('address') # Spammers put URLs in the address field so we reject those right away if not address or address.strip() == '' or address.strip().startswith( 'http'): incomplete.append('address') else: values['address'] = address complete.append('address') zipcode = self.request.get('zip') if (not zipcode or zipcode.strip() == '') or len(zipcode.strip()) < 4: incomplete.append('zip') else: values['zip'] = zipcode complete.append('zip') city = self.request.get('city') if not city or city.strip() == '': incomplete.append('city') else: values['city'] = city complete.append('city') if 'zip' in incomplete or 'city' in incomplete: incomplete.append('zipcity') country_key = self.request.get('country').strip() country = Country.get(country_key) countries = Country.all().order('order').fetch(100) if not country or not country_key or country_key.strip() == '': incomplete.append('country') # retrieve countries since we're going to need them else: values['country'] = country.name complete.append('country') email = self.request.get('email') if not email or email.strip() == '' or not mail.is_email_valid(email): incomplete.append('email') else: values['email'] = email complete.append('email') mobile = self.request.get('mobile') if mobile and mobile.strip() == '': mobile = None values['mobile'] = mobile home = self.request.get('home') if home and home.strip() == '': home = None values['home'] = home work = self.request.get('work') if work and work.strip() == '': work = None values['work'] = work member_type = self.request.get('type') if not member_type or member_type.strip() == '': member_type = '1' types = MemberType.all().fetch(100) mtype = None # TODO: Custom settings? Constants at least. if member_type == '1': mtype = next(t for t in types if t.name == DEFAULT_MEMBER_NAME) else: mtype = next(t for t in types if t.name == DEFAULT_SUPPORT_MEMBER_NAME) values['type'] = mtype.name comment = self.request.get('comment') complete.append('comment') values['comment'] = comment error_message = '' # Check if member exists; existing = Member.all().filter('email', email).fetch(1) if len(existing) > 0: incomplete.append('email') error_message = 'Det er allerede registrert noen i medlemsregisteret med denne epostadressen!' # TODO: Error message if len(incomplete) > 0: # missing field, redirect to signup page again template = JINJA_ENVIRONMENT.get_template( 'templates/selfservice/signup.html') return self.response.write( template.render({ 'countries': countries, 'incomplete': incomplete, 'complete': complete, 'error_message': error_message, 'values': values })) # invariant: fields are OK, create new member, send mail, # create payment history on member. template = JINJA_ENVIRONMENT.get_template( 'templates/selfservice/signup_receipt.html') data = {'values': values, 'profile_url': PROFILE_URL} statuses = Status.all().fetch(100) # TODO: Handle existing members signing up again new_member = Member() new_member.name = name new_member.address = address new_member.zipcode = zipcode new_member.city = city new_member.notes = comment new_member.country = country new_member.membertype = mtype status = next(s for s in statuses if s.name == SIGNUP_STATUS_NAME) new_member.status = status new_member.number = dbutils.create_new_member_no() new_member.email = email new_member.member_since = datetime.date.today() if mobile: new_member.phone = mobile if work: new_member.phone_work = work if home: new_member.phone_home = home new_member.generate_access_code() new_member.member_since = datetime.date.today() new_member.member_type = mtype new_member.put() new_member.update_index() self.send_welcome_mail(new_member) self.send_notification_mails(new_member) # TODO: Invalidate counts for categories # Handle mutations on members gracefully return self.response.write(template.render(data))
def post(self): complete = [] incomplete = [] values = {} # Holy crap this is ugly. There has to be a better way. name = self.request.get('name') if not name or name.strip() == '': incomplete.append('name') else: values['name'] = name complete.append('name') address = self.request.get('address') if not address or address.strip() == '': incomplete.append('address') else: values['address'] = address complete.append('address') zipcode = self.request.get('zip') if (not zipcode or zipcode.strip() == '') or len(zipcode.strip()) < 4: incomplete.append('zip') else: values['zip'] = zipcode complete.append('zip') city = self.request.get('city') if not city or city.strip() == '': incomplete.append('city') else: values['city'] = city complete.append('city') if 'zip' in incomplete or 'city' in incomplete: incomplete.append('zipcity') country_key = self.request.get('country').strip() country = Country.get(country_key) countries = Country.all().order('order').fetch(100) if not country or not country_key or country_key.strip() == '': incomplete.append('country') # retrieve countries since we're going to need them else: values['country'] = country.name complete.append('country') email = self.request.get('email') if not email or email.strip() == '' or not mail.is_email_valid(email): incomplete.append('email') else: values['email'] = email complete.append('email') mobile = self.request.get('mobile') if mobile and mobile.strip() == '': mobile = None values['mobile'] = mobile home = self.request.get('home') if home and home.strip() == '': home = None values['home'] = home work = self.request.get('work') if work and work.strip() == '': work = None values['work'] = work member_type = self.request.get('type') if not member_type or member_type.strip() == '': member_type = '1' types = MemberType.all().fetch(100) mtype = None # TODO: Custom settings? Constants at least. if member_type == '1': mtype = next(t for t in types if t.name == DEFAULT_MEMBER_NAME) else: mtype = next(t for t in types if t.name == DEFAULT_SUPPORT_MEMBER_NAME) values['type'] = mtype.name comment = self.request.get('comment') complete.append('comment') values['comment'] = comment error_message = '' # Check if member exists; existing = Member.all().filter('email', email).fetch(1) if len(existing) > 0: incomplete.append('email') error_message = 'Det er allerede registrert noen i medlemsregisteret med denne epostadressen!' # TODO: Error message if len(incomplete) > 0: # missing field, redirect to signup page again template = JINJA_ENVIRONMENT.get_template('templates/selfservice/signup.html') return self.response.write(template.render({ 'countries': countries, 'incomplete': incomplete, 'complete': complete, 'error_message': error_message, 'values': values })) # invariant: fields are OK, create new member, send mail, # create payment history on member. template = JINJA_ENVIRONMENT.get_template('templates/selfservice/signup_receipt.html') data = { 'values': values, 'profile_url': PROFILE_URL } statuses = Status.all().fetch(100) # TODO: Handle existing members signing up again new_member = Member() new_member.name = name new_member.address = address new_member.zipcode = zipcode new_member.city = city new_member.notes = comment new_member.country = country new_member.membertype = mtype status = next(s for s in statuses if s.name == SIGNUP_STATUS_NAME) new_member.status = status new_member.number = dbutils.create_new_member_no() new_member.email = email new_member.member_since = datetime.date.today() if mobile: new_member.phone = mobile if work: new_member.phone_work = work if home: new_member.phone_home = home new_member.generate_access_code() new_member.member_since = datetime.date.today() new_member.member_type = mtype new_member.put() self.send_welcome_mail(new_member) self.send_notification_mails(new_member) # TODO: Invalidate counts for categories # Handle mutations on members gracefully return self.response.write(template.render(data))
def generate_edit_codes(): """ Mass update edit codes for members """ for member in Member.all().fetch(10000): member.generate_access_code() member.put()