Example #1
0
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)