def main(): N = 0 ages = set([None]) data = [] while True: current = {None: 0} N += 1 g = Es.by_name('leden%s' % N) if g is None: break start_dt, end_dt = Es.year_to_range(N) for m in g.get_members(): if m.dateOfBirth is None: continue age = int((start_dt - m.dateOfBirth).days / 365.242) if age not in current: current[age] = 0 if age not in ages: ages.add(age) current[age] += 1 data.append(current) if None in ages: ages.remove(None) with open('age-per-year.txt', 'w') as f: f.write('# ?') for age in range(min(*ages), max(*ages)): f.write(' ' + str(age)) f.write('\n') for _year, d in enumerate(data): year = _year + 1 f.write('%s %s ' % (year, d.get(None, 0))) for age in range(min(*ages), max(*ages)): f.write('%2d ' % d.get(age, 0)) f.write('\n') g = pyx.graph.graphxy(width=14, x=pyx.graph.axis.bar()) colass = {} for i, age in enumerate(range(min(*ages) + 1, max(*ages))): colass['y%s' % age] = i + 2 styles = [pyx.graph.style.bar([ pyx.color.gradient.ReverseHue.select( 0, max(*ages) - min(*ages))])] for i, age in enumerate(range(min(*ages) + 1, max(*ages))): styles.extend([pyx.graph.style.stackedbarpos('y%s' % age), pyx.graph.style.bar([ pyx.color.gradient.ReverseHue.select( i + 1, max(*ages) - min(*ages))])]) cdata = [] for d in data: cum = 0 d2 = {} for age in range(min(*ages), max(*ages)): cum += d.get(age, 0) d2[age] = cum cdata.append(d2) g.plot(pyx.graph.data.points( [[_year + 1] + [d.get(age, 0) for age in range(min(*ages), max(*ages))] for _year, d in enumerate(cdata)], xname=0, y=1, **colass), styles) g.writePDFfile('age-per-year')
def main(): # Fetch year overrides print 'loading year overrides ...' year_overrides = {} for t in Es.bearers_by_tag_id(Es.id_by_name('!year-overrides'), _as=Es.Tag): year_overrides[(t._data['year-override']['type'], t._data['year-override']['year'])] = t._id assert year_overrides years = [t[1] for t in year_overrides.keys()] min_year, max_year = min(years), max(years) leden_id = Es.id_by_name('leden') print 'checking ...' for year in xrange(min_year+1, max_year+1): start_of_year = Es.year_to_range(year)[0] informal_start = start_of_year - datetime.timedelta(3*365/12) for rel in Es.rcol.find({'with': leden_id, 'from': {'$gt': informal_start, '$lt': start_of_year}}): if year_overrides[(False, year-1)] in rel.get('tags', ()): continue if 'tags' not in rel: rel['tags'] = [] rel['tags'].append(year_overrides[(False, year-1)]) print Es.by_id(rel['who']).name, year
def main(): parser = argparse.ArgumentParser(description="Prepare for the next year") parser.add_argument('--apply', action='store_true', help=('Apply the changes. By default the changes ' 'are only displayed')) args = parser.parse_args() # Fetch year overrides while True: years, year_overrides, min_year, max_year = load_year_overrides() assert len(years) == max_year - min_year + 1 # year-override missing? current_year = Es.date_to_year(datetime.datetime.now()) if current_year == max_year: print(' adding year-overrides for year', current_year + 1) if args.apply: create_year_overrides_for(current_year + 1) continue break # Fetch ids of all current members leden_id = Es.id_by_name('leden') print('If you became a member after june,' ' you should be in the next year ...') for year in range(min_year + 1, max_year + 1): start_of_year = Es.year_to_range(year)[0] informal_start = start_of_year - datetime.timedelta(3 * 365 / 12) for rel in Es.rcol.find({'with': leden_id, 'from': {'$gt': informal_start, '$lt': start_of_year}}): if year_overrides[(False, year - 1)] in rel.get('tags', ()): continue if 'tags' not in rel: rel['tags'] = [] rel['tags'].append(year_overrides[(False, year - 1)]) print(' ', Es.by_id(rel['who']).name, '-' + str(year - 1)) if args.apply: Es.rcol.save(rel) print('Any relation that starts near the change of year, should start') print('exactly on the change of year ...') for year in range(min_year + 1, max_year + 1): start_of_year = Es.year_to_range(year)[0] window = datetime.timedelta(1, 12 * 60 * 60) for rel in Es.rcol.find({'from': {'$gt': start_of_year - window, '$lt': start_of_year + window}}): if rel['from'] == start_of_year: continue how = Es.by_id(rel['how']) print(' {} {} (as {}): {} -> {}'.format( six.text_type(Es.by_id(rel['who'])), str(Es.by_id(rel['with'])), how._data['sofa_suffix'] if how else 'member', rel['from'], start_of_year )) if args.apply: rel['from'] = start_of_year Es.rcol.save(rel) print('Any relation that ends near the change of year, should end') print('exactly on the change of year ...') for year in range(min_year + 1, max_year + 1): start_of_year = Es.year_to_range(year)[0] end_of_year = Es.year_to_range(year)[0] - datetime.timedelta(0, 1) window = datetime.timedelta(1, 12 * 60 * 60) for rel in Es.rcol.find({'until': {'$gt': start_of_year - window, '$lt': start_of_year + window}}): if rel['until'] == end_of_year: continue how = Es.by_id(rel['how']) print(' {} {} (as {}): {} -> {}'.format( six.text_type(Es.by_id(rel['who'])), str(Es.by_id(rel['with'])), how._data['sofa_suffix'] if how else 'member', rel['until'], end_of_year )) if args.apply: rel['until'] = end_of_year Es.rcol.save(rel)
def main(): parser = argparse.ArgumentParser(description="Prepare for the next year") parser.add_argument('--apply', action='store_true', help=('Apply the changes. By default the changes ' 'are only displayed')) args = parser.parse_args() # Fetch year overrides while True: years, year_overrides, min_year, max_year = load_year_overrides() assert len(years) == max_year - min_year + 1 # year-override missing? current_year = Es.date_to_year(datetime.datetime.now()) if current_year == max_year: print(' adding year-overrides for year', current_year + 1) if args.apply: create_year_overrides_for(current_year + 1) continue break today = datetime.datetime.today() max_year = today.year - Es.DT_MIN.year + 1 # Fetch ids of all current members leden_id = Es.id_by_name('leden') print('If you became a member after june,' ' you should be in the next year ...') for year in range(min_year + 1, max_year): start_of_year = Es.year_to_range(year)[0] informal_start = start_of_year - datetime.timedelta(3 * 365 / 12) for rel in Es.rcol.find({ 'with': leden_id, 'from': { '$gt': informal_start, '$lt': start_of_year } }): if year_overrides[(False, year - 1)] in rel.get('tags', ()): continue if 'tags' not in rel: rel['tags'] = [] rel['tags'].append(year_overrides[(False, year - 1)]) print(' ', Es.by_id(rel['who']).name, '-' + str(year - 1)) if args.apply: Es.rcol.save(rel) print('Any relation that starts near the change of year, should start') print('exactly on the change of year ...') for year in range(min_year + 1, max_year): start_of_year = Es.year_to_range(year)[0] window = datetime.timedelta(1, 12 * 60 * 60) for rel in Es.rcol.find({ 'from': { '$gt': start_of_year - window, '$lt': start_of_year + window } }): if rel['from'] == start_of_year: continue how = Es.by_id(rel['how']) print(' {} {} (as {}): {} -> {}'.format( six.text_type(Es.by_id(rel['who'])), str(Es.by_id(rel['with'])), how._data['sofa_suffix'] if how else 'member', rel['from'], start_of_year)) if args.apply: rel['from'] = start_of_year Es.rcol.save(rel) print('Any relation that ends near the change of year, should end') print('exactly on the change of year ...') for year in range(min_year + 1, max_year): start_of_year = Es.year_to_range(year)[0] end_of_year = Es.year_to_range(year)[0] - datetime.timedelta(0, 1) window = datetime.timedelta(1, 12 * 60 * 60) for rel in Es.rcol.find({ 'until': { '$gt': start_of_year - window, '$lt': start_of_year + window } }): if rel['until'] == end_of_year: continue how = Es.by_id(rel['how']) print(' {} {} (as {}): {} -> {}'.format( six.text_type(Es.by_id(rel['who'])), str(Es.by_id(rel['with'])), how._data['sofa_suffix'] if how else 'member', rel['until'], end_of_year)) if args.apply: rel['until'] = end_of_year Es.rcol.save(rel) print('End eerstejaars relations from previous year ...') ej = Es.by_name('eerstejaars') members = Es.rcol.find({'with': ej._data['_id'], 'until': Es.DT_MAX}) for r in sorted(members, key=lambda r: r['from']): member = Es.by_id(r['who']) if r['from'] >= datetime.datetime(today.year, 7, 1): continue # Only just became a member, don't remove. until = datetime.datetime(today.year, 8, 31, 23, 59, 59) print(' {:25} from {:26} until None -> {}'.format( member.humanName, str(r['from']), str(until))) if args.apply: r['until'] = until Es.rcol.save(r)