Beispiel #1
0
def planning_view(request):
    period = 'now'
    if request.GET.get('year') in {'past1', 'past2'}:
        period = request.GET['year']
    pools = list(Pool.all())
    poolid2index = dict()
    poolids = set()
    for pool in pools:
        poolids.add(_id(pool))
    # TODO reduce number of queries
    current = date_to_midnight(now() - datetime.timedelta(days=1))
    past1year = date_to_midnight(now() - datetime.timedelta(days=356))
    past2year = date_to_midnight(now() - datetime.timedelta(days=356*2))
    if period == 'now':
        start = current
        end = None
    elif period == 'past1':
        start = past1year
        end = current
    elif period == 'past2':
        start = past2year
        end = past1year
    event_entities = list(Event.all_in_period(start, end))
    used_pools = set()
    for e in event_entities:
        for v in e.vacancies():
            used_pools.add(v.pool_id)
    pools_tpl = []
    i = 0
    for pool in pools:
        if _id(pool) not in used_pools:
            continue
        poolid2index[pool._id] = i
        pools_tpl.append(pool)
        i += 1
    events = list()
    for e in event_entities:
        ei = {'id': _id(e),
              'name': e.name,
              'datetime': e.date,
              'kind': e.kind,
              'vacancies': dict()}
        for index in poolid2index.values():
            ei['vacancies'][index] = list()
        for v in e.vacancies():
            ei['vacancies'][poolid2index[v.pool_id]].append({
                'begin': v.begin,
                'begin_time': v.begin_time,
                'end_time': v.end_time,
                'assignee': v.assignee.humanName
                if v.assignee else "?"})
        for index in poolid2index.values():
            ei['vacancies'][index].sort(key=lambda x: x['begin'])
        events.append(ei)
    events.sort(key=lambda x: x['datetime'])
    return render_to_response('planning/overview.html',
                              {'events': events,
                               'pools': pools_tpl,
                               'period': period},
                              context_instance=RequestContext(request))
Beispiel #2
0
def planning_poollist(request):
    if not may_manage_planning(request.user):
        # There's no planning you can change anyway, so what are you doing
        # here?
        raise PermissionDenied
    pools = list(Pool.all())
    return render(request, 'planning/pools.html', {'pools': pools})
Beispiel #3
0
def planning_view(request):
    pools = list(Pool.all())
    poolid2idx = dict()
    i = 0
    for pool in pools:
        poolid2idx[pool._id] = i
        i += 1
    events = list()
    # TODO reduce number of queries
    for e in Event.all_in_future():
        ei = {  'name': e.name,
                'date': str(e.date.date()),
                'kind': e.kind,
            'vacancies': dict()}
        for idx in poolid2idx.values():
            ei['vacancies'][idx] = list()
        for v in e.vacancies():
            ei['vacancies'][poolid2idx[v.pool_id]].append({
                'begin': v.begin,
                'begin_time': v.begin_time,
                'end_time': v.end_time,
                'assignee': v.assignee.get_user().humanName
                        if v.assignee else "?"})
        for idx in poolid2idx.values():
            ei['vacancies'][idx].sort(key=lambda x: x['begin'])
        events.append(ei)
    events.sort(key=lambda x: x['date'])
    return render_to_response('planning/overview.html',
            {'events': events,
             'pools': pools,
             'poolcount': len(pools)},
            context_instance=RequestContext(request))
Beispiel #4
0
def planning_poollist(request):
    if not may_manage_planning(request.user):
        # There's no planning you can change anyway, so what are you doing here?
        raise PermissionDenied
    pools = list(Pool.all())
    return render_to_response('planning/pools.html',
            {'pools': pools},
            context_instance=RequestContext(request))
Beispiel #5
0
def planning_poollist(request):
    if not may_manage_planning(request.user):
        # There's no planning you can change anyway, so what are you doing
        # here?
        raise PermissionDenied
    pools = list(Pool.all())
    return render(request, 'planning/pools.html',
                  {'pools': pools})
Beispiel #6
0
def event_edit(request, eventid):
    if not may_manage_planning(request.user):
        raise PermissionDenied
    avform = None
    e = Event.by_id(eventid)
    if e is None:
        raise Http404
    if request.method == 'POST':
        if request.POST['action'] == 'remove_event':
            for vacancy in e.vacancies():
                vacancy.delete()
            e.delete()
            return HttpResponseRedirect(reverse('planning-poollist'))
        elif request.POST['action'] == 'remove_vacancy':
            Vacancy.by_id(_id(request.POST['vacancy_id'])).delete()
            return HttpResponseRedirect(reverse('planning-event-edit',
                                                args=(eventid,)))
        elif request.POST['action'] == 'add_vacancy':
            avform = AddVacancyForm(request.POST)
            if avform.is_valid():
                fd = avform.cleaned_data
                (begin_hour, begin_minute) = map(int, fd['begin'].split(':'))
                (end_hour, end_minute) = map(int, fd['end'].split(':'))
                begin_offset = hm2s(begin_hour, begin_minute)
                end_offset = hm2s(end_hour, end_minute)
                begin_date = e.date + datetime.timedelta(seconds=begin_offset)
                end_date = e.date + datetime.timedelta(seconds=end_offset)
                v = Vacancy({
                    'name': fd['name'],
                    'event': _id(e),
                    'begin': (begin_date,
                              fd['begin_is_approximate'] == "True"),
                    'end': (end_date, fd['end_is_approximate'] == "True"),
                    'pool': _id(fd['pool']),
                    'assignee': None,
                    'reminder_needed': True,
                })
                v.save()
                return HttpResponseRedirect(reverse('planning-event-edit',
                                                    args=(eventid,)))
    if avform is None:
        avform = AddVacancyForm()
    pools = dict()
    for p in Pool.all():
        pools[_id(p)] = p
    vacancies = list()
    for v in e.vacancies():
        v.poolname = pools[v.pool_id].name
        v.assignee_text = str(v.assignee.name) if v.assignee else "-"
        v.vid = str(v._id)
        vacancies.append(v)
    vacancies.sort(key=lambda x: str(x.pool_id) + str(x.begin))
    return render(
        request,
        'planning/event_edit.html',
        {'name': e.name, 'kind': e.kind, 'date': e.date.date(),
         'avform': avform, 'vacancies': vacancies},
    )
Beispiel #7
0
def planning_view(request):
    if 'lookbehind' in request.GET:
        lookbehind = int(request.GET['lookbehind'])
    else:
        lookbehind = 1
    pools = list(Pool.all())
    poolid2index = dict()
    poolids = set()
    for pool in pools:
        poolids.add(_id(pool))
    # TODO reduce number of queries
    event_entities = list(Event.all_since_datetime(date_to_midnight(now())
            - datetime.timedelta(days=lookbehind)))
    used_pools = set()
    for e in event_entities:
        for v in e.vacancies():
            used_pools.add(v.pool_id)
    pools_tpl = []
    i = 0
    for pool in pools:
        if _id(pool) not in used_pools:
            continue
        poolid2index[pool._id] = i
        pools_tpl.append(pool)
        i += 1
    events = list()
    for e in event_entities:
        ei = {  'id': _id(e),
                'name': e.name,
                'datetime': e.date,
                'kind': e.kind,
            'vacancies': dict()}
        for index in poolid2index.values():
            ei['vacancies'][index] = list()
        for v in e.vacancies():
            ei['vacancies'][poolid2index[v.pool_id]].append({
                'begin': v.begin,
                'begin_time': v.begin_time,
                'end_time': v.end_time,
                'assignee': v.assignee.humanName
                        if v.assignee else "?"})
        for index in poolid2index.values():
            ei['vacancies'][index].sort(key=lambda x: x['begin'])
        events.append(ei)
    events.sort(key=lambda x: x['datetime'])
    return render_to_response('planning/overview.html',
            {'events': events,
             'pools': pools_tpl},
            context_instance=RequestContext(request))
Beispiel #8
0
class AddVacancyForm(forms.Form):
    name = forms.CharField(label="Shiftnaam", initial="eerste dienst")
    begin = forms.RegexField(label="Begintijd",
                             initial="20:30",
                             regex=r'^[0123][0-9]:[0-5][0-9]$')
    begin_is_approximate = forms.ChoiceField(initial=False,
                                             choices=((True, "bij benadering"),
                                                      (False, "exact")))
    end = forms.RegexField(label="Eindtijd",
                           initial="23:00",
                           regex=r'^[0123][0-9]:[0-5][0-9]$')
    end_is_approximate = forms.ChoiceField(initial=False,
                                           choices=((True, "bij benadering"),
                                                    (False, "exact")))
    pool = forms.ChoiceField(label="Type",
                             choices=map(lambda x: (x._id, x.name),
                                         Pool.all()))
Beispiel #9
0
def planning_view(request):
    if 'lookbehind' in request.GET:
        lookbehind = int(request.GET['lookbehind'])
    else:
        lookbehind = 1
    pools = list(Pool.all())
    poolid2idx = dict()
    i = 0
    for pool in pools:
        poolid2idx[pool._id] = i
        i += 1
    events = list()
    # TODO reduce number of queries
    for e in Event.all_since_datetime(
            date_to_midnight(now()) - datetime.timedelta(days=lookbehind)):
        ei = {
            'name': e.name,
            'datetime': e.date,
            'kind': e.kind,
            'vacancies': dict()
        }
        for idx in poolid2idx.values():
            ei['vacancies'][idx] = list()
        for v in e.vacancies():
            ei['vacancies'][poolid2idx[v.pool_id]].append({
                'begin':
                v.begin,
                'begin_time':
                v.begin_time,
                'end_time':
                v.end_time,
                'assignee':
                v.assignee.get_user().humanName if v.assignee else "?"
            })
        for idx in poolid2idx.values():
            ei['vacancies'][idx].sort(key=lambda x: x['begin'])
        events.append(ei)
    events.sort(key=lambda x: x['datetime'])
    return render_to_response('planning/overview.html', {
        'events': events,
        'pools': pools,
        'poolcount': len(pools)
    },
                              context_instance=RequestContext(request))
Beispiel #10
0
def planning_view(request):
    if 'lookbehind' in request.GET:
        lookbehind = int(request.GET['lookbehind'])
    else:
        lookbehind = 1
    pools = list(Pool.all())
    poolid2idx = dict()
    i = 0
    for pool in pools:
        poolid2idx[pool._id] = i
        i += 1
    events = list()
    # TODO reduce number of queries
    for e in Event.all_since_datetime(date_to_midnight(now())
            - datetime.timedelta(days=lookbehind)):
        ei = {  'name': e.name,
                'datetime': e.date,
                'kind': e.kind,
            'vacancies': dict()}
        for idx in poolid2idx.values():
            ei['vacancies'][idx] = list()
        for v in e.vacancies():
            ei['vacancies'][poolid2idx[v.pool_id]].append({
                'begin': v.begin,
                'begin_time': v.begin_time,
                'end_time': v.end_time,
                'assignee': v.assignee.humanName
                        if v.assignee else "?"})
        for idx in poolid2idx.values():
            ei['vacancies'][idx].sort(key=lambda x: x['begin'])
        events.append(ei)
    events.sort(key=lambda x: x['datetime'])
    return render_to_response('planning/overview.html',
            {'events': events,
             'pools': pools,
             'poolcount': len(pools)},
            context_instance=RequestContext(request))
Beispiel #11
0
def event_edit(request, eventid):
    if not may_manage_planning(request.user):
        raise PermissionDenied
    avform = None
    e = Event.by_id(eventid)
    if e is None:
        raise Http404
    if request.method == 'POST':
        if request.POST['action'] == 'remove_event':
            for vacancy in e.vacancies():
                vacancy.delete()
            e.delete()
            return HttpResponseRedirect(reverse('planning-poollist'))
        elif request.POST['action'] == 'remove_vacancy':
            Vacancy.by_id(_id(request.POST['vacancy_id'])).delete()
            return HttpResponseRedirect(
                reverse('planning-event-edit', args=(eventid, )))
        elif request.POST['action'] == 'add_vacancy':
            avform = AddVacancyForm(request.POST)
            if avform.is_valid():
                fd = avform.cleaned_data
                (begin_hour, begin_minute) = map(int, fd['begin'].split(':'))
                (end_hour, end_minute) = map(int, fd['end'].split(':'))
                begin_offset = hm2s(begin_hour, begin_minute)
                end_offset = hm2s(end_hour, end_minute)
                begin_date = e.date + datetime.timedelta(seconds=begin_offset)
                end_date = e.date + datetime.timedelta(seconds=end_offset)
                v = Vacancy({
                    'name':
                    fd['name'],
                    'event':
                    _id(e),
                    'begin':
                    (begin_date, fd['begin_is_approximate'] == "True"),
                    'end': (end_date, fd['end_is_approximate'] == "True"),
                    'pool':
                    _id(fd['pool']),
                    'assignee':
                    None,
                    'reminder_needed':
                    True,
                })
                v.save()
                return HttpResponseRedirect(
                    reverse('planning-event-edit', args=(eventid, )))
    if avform is None:
        avform = AddVacancyForm()
    pools = dict()
    for p in Pool.all():
        pools[_id(p)] = p
    vacancies = list()
    for v in e.vacancies():
        v.poolname = pools[v.pool_id].name
        v.assignee_text = str(v.assignee.name) if v.assignee else "-"
        v.vid = str(v._id)
        vacancies.append(v)
    vacancies.sort(key=lambda x: str(x.pool_id) + str(x.begin))
    return render(
        request,
        'planning/event_edit.html',
        {
            'name': e.name,
            'kind': e.kind,
            'date': e.date.date(),
            'avform': avform,
            'vacancies': vacancies
        },
    )
Beispiel #12
0
def planning_view(request):
    period = 'now'
    if request.GET.get('year') in {'past1', 'past2'}:
        period = request.GET['year']
    pools = list(Pool.all())
    poolid2index = dict()
    poolids = set()
    for pool in pools:
        poolids.add(_id(pool))
    # TODO reduce number of queries
    current = date_to_midnight(now() - datetime.timedelta(days=1))
    past1year = date_to_midnight(now() - datetime.timedelta(days=356))
    past2year = date_to_midnight(now() - datetime.timedelta(days=356 * 2))
    if period == 'now':
        start = current
        end = None
    elif period == 'past1':
        start = past1year
        end = current
    elif period == 'past2':
        start = past2year
        end = past1year
    event_entities = list(Event.all_in_period(start, end))
    used_pools = set()
    for e in event_entities:
        for v in e.vacancies():
            used_pools.add(v.pool_id)
    pools_tpl = []
    i = 0
    for pool in pools:
        if _id(pool) not in used_pools:
            continue
        poolid2index[pool._id] = i
        pools_tpl.append(pool)
        i += 1
    events = list()
    for e in event_entities:
        ei = {
            'id': _id(e),
            'name': e.name,
            'datetime': e.date,
            'kind': e.kind,
            'vacancies': dict()
        }
        for index in poolid2index.values():
            ei['vacancies'][index] = list()
        for v in e.vacancies():
            ei['vacancies'][poolid2index[v.pool_id]].append({
                'begin':
                v.begin,
                'begin_time':
                v.begin_time,
                'end_time':
                v.end_time,
                'assignee':
                v.assignee.humanName if v.assignee else "?"
            })
        for index in poolid2index.values():
            ei['vacancies'][index].sort(key=lambda x: x['begin'])
        events.append(ei)
    events.sort(key=lambda x: x['datetime'])
    return render(request, 'planning/overview.html', {
        'events': events,
        'pools': pools_tpl,
        'period': period
    })
Beispiel #13
0
def planning_poollist(request):
    pools = list(Pool.all())
    return render_to_response('planning/pools.html',
            {'pools': pools},
            context_instance=RequestContext(request))
Beispiel #14
0
def planning_poollist(request):
    pools = list(Pool.all())
    return render_to_response('planning/pools.html', {'pools': pools},
                              context_instance=RequestContext(request))
Beispiel #15
0
# vim: et:sta:bs=2:sw=4:
import _import
import datetime
import sys

import kn.leden.entities as Es
from kn.settings import DT_MIN, DT_MAX
from kn.leden.mongo import _id
from kn.leden.date import now
from kn.planning.entities import Pool, Worker, Vacancy

pools = dict()
for p in Pool.all():
    pools[p.name] = p

workers = dict()
for w in Worker.all():
    workers[w.get_user()] = w

dt = now()
for w in workers.itervalues():
    del w.pools[:]
for type in ['tappers', 'bestuur', 'barco', 'draai', 'cocks']:
    poolid = _id(pools[type])
    group = Es.by_name(type)
    relations = group.get_rrelated(None, dt, dt, True, None, None)
    for gm in relations:
        if gm['who'] in workers:
            if poolid not in workers[gm['who']].pools:
                print '%s -> %s' % (gm['who'].name, type)
                workers[gm['who']].pools.append(poolid)
Beispiel #16
0
# vim: et:sta:bs=2:sw=4:
import _import
import datetime
import sys

import kn.leden.entities as Es
from kn.settings import DT_MIN, DT_MAX
from kn.leden.mongo import _id
from kn.leden.date import now
from kn.planning.entities import Pool, Worker, Vacancy

pools = dict()
for p in Pool.all():
    pools[p.name] = p

workers = dict()
for w in Worker.all():
    workers[w.get_user()] = w

dt = now()
for w in workers.itervalues():
    del w.pools[:]
for type in ["tappers", "bestuur", "barco", "draai", "cocks"]:
    poolid = _id(pools[type])
    group = Es.by_name(type)
    relations = group.get_rrelated(None, dt, dt, True, None, None)
    for gm in relations:
        if gm["who"] in workers:
            if poolid not in workers[gm["who"]].pools:
                print "%s -> %s" % (gm["who"].name, type)
                workers[gm["who"]].pools.append(poolid)