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))
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})
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))
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))
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}, )
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))
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()))
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))
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))
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 }, )
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 })
def planning_poollist(request): pools = list(Pool.all()) return render_to_response('planning/pools.html', {'pools': pools}, context_instance=RequestContext(request))
# 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)
# 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)