Beispiel #1
0
def event_create(request):
    if not may_manage_planning(request.user):
        raise PermissionDenied
    if request.method == 'POST':
        form = EventCreateForm(request.POST)
        if form.is_valid():
            fd = form.cleaned_data
            day = date_to_dt(fd['date'])
            e = Event({
                'name': fd['name'],
                'date': day,
                'kind': fd['template']
            })
            e.save()
            for poolname, periods in templates[fd['template']].items():
                pool = Pool.by_name(poolname)
                for period in periods:
                    begin_date = day + datetime.timedelta(seconds=period[0][0])
                    end_date = day + datetime.timedelta(seconds=period[1][0])
                    v = Vacancy({
                        'name': period[2],
                        'event': _id(e),
                        'begin': (begin_date, period[0][1]),
                        'end': (end_date, period[1][1]),
                        'pool': _id(pool),
                        'assignee': None,
                        'reminder_needed': True,
                    })
                    v.save()
            return HttpResponseRedirect(
                reverse('planning-event-edit', args=(e._id, )))
    else:
        form = EventCreateForm()
    return render(request, 'planning/event_create.html', {'form': form})
Beispiel #2
0
def planning_template(request, poolname):
    pool = Pool.by_name(poolname)
    events = list()
    # TODO reduce number of queries
    for e in Event.all_in_future():
        vacancies = list(e.vacancies(pool))
        if not vacancies:
            continue
        ei = {'name': e.name, 'date': e.date, 'vacancies': list()}
        shifts = dict()
        for v in vacancies:
            if v.begin not in shifts:
                shifts[v.begin] = {
                    'name': v.name,
                    'begin': v.begin,
                    'begin_time': v.begin_time,
                    'end_time': v.end_time,
                    'assignees': list()
                }
            shifts[v.begin]['assignees'].append(v.assignee)
        ei['vacancies'] = [
            x[1] for x in sorted(shifts.items(), key=lambda x: x[0])
        ]
        events.append(ei)
    events.sort(key=lambda x: x['date'])
    return render(request, 'planning/template.html', {'events': events})
Beispiel #3
0
def planning_template(request, poolname):
    pool = Pool.by_name(poolname)
    events = list()
    # TODO reduce number of queries
    for e in Event.all_in_future():
        vacancies = list(e.vacancies(pool))
        if not vacancies:
            continue
        ei = {  'name': e.name,
                'date': e.date,
            'vacancies': list()}
        shifts = dict()
        for v in vacancies:
            if not v.begin in shifts:
                shifts[v.begin] = {
                    'name': v.name,
                    'begin': v.begin,
                    'begin_time': v.begin_time,
                    'end_time': v.end_time,
                    'assignees': list()}
            shifts[v.begin]['assignees'].append(v.assignee)
        ei['vacancies'] = map(lambda x: x[1], sorted(shifts.items(),
            key=lambda x: x[0]))
        events.append(ei)
    events.sort(key=lambda x: x['date'])
    return render_to_response('planning/template.html', {'events': events},
            context_instance=RequestContext(request))
Beispiel #4
0
def planning_template(request, poolname):
    locale.setlocale(locale.LC_ALL, 'nl_NL')
    pool = Pool.by_name(poolname)
    events = list()
    # TODO reduce number of queries
    for e in Event.all_in_future():
        vacancies = list(e.vacancies(pool))
        if not vacancies:
            continue
        ei = {  'name': e.name,
                'date': str(e.date.date()),
            'vacancies': list()}
        ei['description'] = e.date.strftime('%A %d %B')
        if e.name != 'Borrel':
            ei['description'] = '%s (%s)' % (ei['description'], ei['name'])
        shifts = dict()
        for v in vacancies:
            if not v.begin in shifts:
                shifts[v.begin] = {
                    'name': v.name,
                    'begin': v.begin,
                    'begin_time': v.begin_time,
                    'end_time': v.end_time,
                    'assignees': list()}
            shifts[v.begin]['assignees'].append(v.assignee)
        ei['vacancies'] = map(lambda x: x[1], sorted(shifts.items(),
            key=lambda x: x[0]))
        events.append(ei)
    events.sort(key=lambda x: x['date'])
    return render_to_response('planning/template.html', {'events': events},
            context_instance=RequestContext(request))
Beispiel #5
0
def event_create(request):
    if request.method == 'POST':
        form = EventCreateForm(request.POST)
        if form.is_valid():
            fd = form.cleaned_data
            day = date_to_dt(fd['date'])
            e = Event({
                'name': fd['name'],
                'date': day,
                'kind': fd['template']})
            e.save()
            for poolname, periods in templates[fd['template']].items():
                pool = Pool.by_name(poolname)
                for period in periods:
                    begin_date = day + datetime.timedelta(seconds=period[0][0])
                    end_date = day + datetime.timedelta(seconds=period[1][0])
                    v = Vacancy({
                        'name': period[2],
                        'event': _id(e),
                        'begin': (begin_date, period[0][1]),
                        'end': (end_date, period[1][1]) ,
                        'pool': _id(pool),
                        'assignee': None,
                        'reminder_needed': True,
                    })
                    v.save()
            return HttpResponseRedirect(reverse('planning-event-edit',
                args=(e._id,)))
    else:
        form = EventCreateForm()
    return render_to_response('planning/event_create.html', {'form': form},
            context_instance=RequestContext(request))
Beispiel #6
0
def planning_manage(request, poolname):
    if not may_manage_planning(request.user):
        raise PermissionDenied
    pool = Pool.by_name(poolname)
    if pool is None:
        raise Http404
    if not pool.may_manage(request.user):
        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 is 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 = pool.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
    shifts = pool.last_shifts()
    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: shifts[_id(x)]
                             if shifts[_id(x)] else DT_MIN.date())
                for scorer in scorers:
                    vacancy.suggestions.append({
                        'scorer': scorer,
                        'score': score
                    })

    events = list(events.values())
    events.sort(key=lambda e: e['date'])
    return render(request, 'planning/manage.html', {
        'events': events,
        'pool': pool
    })
Beispiel #7
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 = pool.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
    shifts = pool.last_shifts()
    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: shifts[_id(x)], 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': pool},
           context_instance=RequestContext(request))
Beispiel #8
0
    'tappers': [[hm2s(20, 30), hm2s(23), 'eerste dienst'],
    [hm2s(23), hm2s(25), 'tweede dienst'],
    [hm2s(25), hm2s(28), 'derde dienst']],
    'bestuur': [[hm2s(20, 30), hm2s(24), 'openen'],
    [hm2s(24), hm2s(28), 'sluiten']],
    'draai': [[hm2s(20, 45), hm2s(23), 'openen'],
    [hm2s(23), hm2s(24), 'prime-time'],
    [hm2s(24), hm2s(25), 'sluiten']]}

day = datetime.datetime.strptime(sys.argv[1], '%Y-%m-%d')

e = Event({
    'name': 'Borrel',
    'date': day,
    'kind': 'borrel' })
e.save()

for _type, periods in typePeriods.items():
    pool = Pool.by_name(_type)
    for period in periods:
        v = Vacancy({
            'name': period[2],
            'event': _id(e),
            'begin': day + datetime.timedelta(seconds=period[0]),
            'end': day + datetime.timedelta(seconds=period[1]),
            'pool': _id(pool),
            'assignee': None,
        })
        print v._data
        v.save()
Beispiel #9
0
    'tappers': [[hm2s(20, 30), hm2s(23), 'eerste dienst'],
    [hm2s(23), hm2s(25), 'tweede dienst'],
    [hm2s(25), hm2s(28), 'derde dienst']],
    'bestuur': [[hm2s(20, 30), hm2s(24), 'openen'],
    [hm2s(24), hm2s(28), 'sluiten']],
    'draai': [[hm2s(20, 45), hm2s(23), 'openen'],
    [hm2s(23), hm2s(24), 'prime-time'],
    [hm2s(24), hm2s(25), 'sluiten']]}

day = datetime.datetime.strptime(sys.argv[1], '%Y-%m-%d')

e = Event({
    'name': 'Borrel',
    'date': day,
    'kind': 'borrel' })
e.save()

for _type, periods in typePeriods.items():
    pool = Pool.by_name(_type)
    for period in periods:
        v = Vacancy({
            'name': period[2],
            'event': _id(e),
            'begin': day + datetime.timedelta(seconds=period[0]),
            'end': day + datetime.timedelta(seconds=period[1]),
            'pool': _id(pool),
            'assignee': None,
        })
        print v._data
        v.save()
Beispiel #10
0
import sys

from kn.leden.mongo import _id
from kn.planning.entities import Event, Pool, Vacancy


def hm2s(hours, minutes=0):
    return (hours * 60 + minutes) * 60


begin = datetime.datetime.strptime('%s %s' % (sys.argv[1], sys.argv[2]),
                                   '%Y-%m-%d %H:%M')

e = Event({
    'name': 'Dranktelling',
    'date': datetime.datetime.combine(begin.date(), datetime.time())})
e.save()

pool = Pool.by_name('barco')

for p in [1, 2]:
    v = Vacancy({
        'name': 'Teller %d' % p,
        'event': _id(e),
        'begin': begin,
        'end': begin + datetime.timedelta(seconds=1800),
        'pool': _id(pool),
        'assignee': None})
    print(v._data)
    v.save()
Beispiel #11
0
from kn.leden.mongo import _id
from kn.settings import DT_MIN, DT_MAX
from kn.planning.entities import Pool, Worker, Event, Vacancy


def hm2s(hours, minutes=0):
    return (hours * 60 + minutes) * 60


begin = datetime.datetime.strptime('%s %s' % (sys.argv[1], sys.argv[2]),
                                   '%Y-%m-%d %H:%M')

e = Event({
    'name': 'Dranktelling',
    'date': datetime.datetime.combine(begin.date(), datetime.time())
})
e.save()

pool = Pool.by_name('barco')

for p in [1, 2]:
    v = Vacancy({
        'name': 'Teller %d' % p,
        'event': _id(e),
        'begin': begin,
        'end': begin + datetime.timedelta(seconds=1800),
        'pool': _id(pool),
        'assignee': None
    })
    print v._data
    v.save()