def __init__(self, *args, **kwargs): vacancies = kwargs['vacancies'] del kwargs['vacancies'] pool = kwargs['pool'] del kwargs['pool'] super(ManagePlanningForm, self).__init__(*args, **kwargs) for vacancy in vacancies: field = WorkerChoiceField(label='%s - %s' % ( vacancy.begin_time, vacancy.end_time), choices=Worker.all_in_pool(pool), sort_choices=True, initial=vacancy.assignee_id, required=False) self.fields['shift_%s' % vacancy._id] = field for vacancy in vacancies: vacancy.set_form_field(self['shift_%s' % vacancy._id])
def __init__(self, *args, **kwargs): vacancies = kwargs['vacancies'] del kwargs['vacancies'] pool = kwargs['pool'] del kwargs['pool'] super(ManagePlanningForm, self).__init__(*args, **kwargs) for vacancy in vacancies: field = WorkerChoiceField(label='%s - %s' % (vacancy.begin_time, vacancy.end_time), choices=Worker.all_in_pool(pool), sort_choices=True, initial=vacancy.assignee_id, required=False) self.fields['shift_%s' % vacancy._id] = field for vacancy in vacancies: vacancy.set_form_field(self['shift_%s' % vacancy._id])
def planning_manage(request, poolname): pool = Pool.by_name(poolname) if pool is None: raise Http404 if not request.user.cached_groups_names & set( ['secretariaat', pool.administrator]): raise PermissionDenied # TODO reduce number of queries events = dict() for e in Event.all_in_future(): eid = _id(e) vacancies = list(e.vacancies(pool=pool)) events[eid] = { 'vacancies': vacancies, 'date': e.date.date(), 'name': e.name, 'kind': e.kind, 'id': eid } posted = False events[eid]['vacancies'].sort(key=lambda v: v.begin) if request.method == 'POST' and _id(request.POST['eid']) == eid: events[eid]['form'] = ManagePlanningForm( request.POST, pool=pool, vacancies=events[eid]['vacancies']) posted = True else: events[eid]['form'] = ManagePlanningForm( pool=pool, vacancies=events[eid]['vacancies']) if posted and events[eid]['form'].is_valid(): for vacancy in events[eid]['vacancies']: worker = request.POST['shift_%s' % vacancy._id] if worker == '': vacancy.assignee = None vacancy.reminder_needed = True else: if vacancy.assignee_id == None or \ _id(vacancy.assignee_id) != _id(worker): delta = datetime.timedelta(days=5) vacancy.reminder_needed = now() + delta < e.date vacancy.assignee_id = _id(worker) vacancy.save() workers = list(Worker.all_in_pool(pool)) for worker in workers: # XXX het is cooler de shift dichtstbijzijnd aan de vacancy te # zoeken. Stel dat iemand over een half-jaar al is ingepland # dan is dat niet zo boeiend. Terwijl hij nu geen enkele # bardienst meer zou krijgen worker.set_last_shift(pool) for eid in events: for vacancy in events[eid]['vacancies']: vacancy.suggestions = list() workers_by_score = dict() for worker in workers: score = planning_vacancy_worker_score(vacancy, worker) if score not in workers_by_score: workers_by_score[score] = list() workers_by_score[score].append(worker) found_scores = list(workers_by_score.keys()) found_scores.sort(reverse=True) for score in found_scores: scorers = workers_by_score[score] shuffle(scorers) scorers.sort(key=lambda x: x.last_shift, cmp=cmp_None) for scorer in scorers: vacancy.suggestions.append({ 'scorer': scorer, 'score': score }) events = list(events.values()) events.sort(key=lambda e: e['date']) return render_to_response('planning/manage.html', { 'events': events, 'pool': poolname }, context_instance=RequestContext(request))
def planning_manage(request, poolname): pool = Pool.by_name(poolname) if pool is None: raise Http404 if not request.user.cached_groups_names & set(['secretariaat', pool.administrator]): raise PermissionDenied # TODO reduce number of queries events = dict() for e in Event.all_in_future(): eid = _id(e) vacancies = list(e.vacancies(pool=pool)) events[eid] = {'vacancies': vacancies, 'date': e.date.date(), 'name': e.name, 'kind': e.kind, 'id': eid} posted = False events[eid]['vacancies'].sort(key=lambda v: v.begin) if request.method == 'POST' and _id(request.POST['eid']) == eid: events[eid]['form'] = ManagePlanningForm(request.POST, pool=pool, vacancies=events[eid]['vacancies']) posted = True else: events[eid]['form'] = ManagePlanningForm(pool=pool, vacancies=events[eid]['vacancies']) if posted and events[eid]['form'].is_valid(): for vacancy in events[eid]['vacancies']: worker = request.POST['shift_%s' % vacancy._id] if worker == '': vacancy.assignee = None vacancy.reminder_needed = True else: if vacancy.assignee_id == None or \ _id(vacancy.assignee_id) != _id(worker): delta = datetime.timedelta(days=5) vacancy.reminder_needed = now() + delta < e.date vacancy.assignee_id = _id(worker) vacancy.save() workers = list(Worker.all_in_pool(pool)) for worker in workers: # XXX het is cooler de shift dichtstbijzijnd aan de vacancy te # zoeken. Stel dat iemand over een half-jaar al is ingepland # dan is dat niet zo boeiend. Terwijl hij nu geen enkele # bardienst meer zou krijgen worker.gather_last_shift() for eid in events: for vacancy in events[eid]['vacancies']: vacancy.suggestions = list() workers_by_score = dict() for worker in workers: score = planning_vacancy_worker_score(vacancy, worker) if score not in workers_by_score: workers_by_score[score] = list() workers_by_score[score].append(worker) found_scores = list(workers_by_score.keys()) found_scores.sort(reverse=True) for score in found_scores: scorers = workers_by_score[score] shuffle(scorers) scorers.sort(key=lambda x: x.last_shift, cmp=cmp_None) for scorer in scorers: vacancy.suggestions.append({'scorer': scorer, 'score': score}) events = list(events.values()) events.sort(key=lambda e: e['date']) return render_to_response('planning/manage.html', {'events': events}, context_instance=RequestContext(request))
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) else:
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) else: