예제 #1
0
 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])
예제 #2
0
파일: forms.py 프로젝트: Jille/kninfra
 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])
예제 #3
0
파일: views.py 프로젝트: Jille/kninfra
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))
예제 #4
0
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))
예제 #5
0
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:
예제 #6
0
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: