示例#1
0
文件: views.py 项目: Blackeel/kninfra
def secr_add_group(request):
    if 'secretariaat' not in request.user.cached_groups_names:
        raise PermissionDenied
    if request.method == 'POST':
        form = AddGroupForm(request.POST)
        if form.is_valid():
            fd = form.cleaned_data
            nm = fd['name']
            g = Es.Group({
                'types': ['group', 'tag'],
                'names': [nm],
                'use_mailman_list':
                fd['true_group'],
                'has_unix_group':
                fd['true_group'],
                'humanNames': [{
                    'name': nm,
                    'human': fd['humanName'],
                    'genitive_prefix': fd['genitive_prefix']
                }],
                'description':
                fd['description'],
                'tags': [_id(fd['parent'])]
            })
            logging.info("Added group %s" % nm)
            g.save()
            Es.notify_informacie('addgroup', request.user, entity=g._id)
            giedo.sync_async(request)
            messages.info(request, 'Groep toegevoegd.')
            return HttpResponseRedirect(reverse('group-by-name', args=(nm, )))
    else:
        form = AddGroupForm()
    return render(request, 'leden/secr_add_group.html', {'form': form})
示例#2
0
def secr_add_group(request):
    if 'secretariaat' not in request.user.cached_groups_names:
        raise PermissionDenied
    if request.method == 'POST':
        form = AddGroupForm(request.POST)
        if form.is_valid():
            fd = form.cleaned_data
            nm = fd['name']
            g = Es.Group({
                'types': ['group', 'tag'],
                'names': [nm],
                'use_mailman_list': fd['true_group'],
                'has_unix_group': fd['true_group'],
                'humanNames': [{'name': nm,
                    'human': fd['humanName'],
                    'genitive_prefix': fd['genitive_prefix']}],
                    'description': fd['description'],
                'tags': [_id(fd['parent'])]})
            logging.info("Added group %s" % nm)
            g.save()
            Es.notify_informacie("De groep %s is opgericht." % (
                        unicode(g.humanName)))
            giedo.sync_async(request)
            request.user.push_message("Groep toegevoegd.")
            return HttpResponseRedirect(reverse('group-by-name', args=(nm,)))
    else:
        form = AddGroupForm()
    return render_to_response('leden/secr_add_group.html', {'form': form},
            context_instance=RequestContext(request))
示例#3
0
def relation_begin(request):
    # TODO We should use Django forms, or better: use sweet Ajax
    d = {}
    for t in ('who', 'with', 'how'):
        if t not in request.POST:
            raise ValueError, "Missing attr %s" % t
        if t == 'how' and (not request.POST[t] or
                               request.POST[t] == 'null'):
            d[t] = None
        else:
            d[t] = _id(request.POST[t])
    if not Es.user_may_begin_relation(request.user, d['who'], d['with'],
                                                                d['how']):
        raise PermissionDenied

    # Check whether such a relation already exists
    dt = now()
    ok = False
    try:
        next(Es.query_relations(who=d['who'], _with=d['with'],
            how=d['how'], _from=dt, until=DT_MAX))
    except StopIteration:
        ok = True
    if not ok:
        raise ValueError, "This relation already exists"

    # Add the relation!
    relation_id = Es.add_relation(d['who'], d['with'], d['how'], dt, DT_MAX)

    # Notify informacie
    # TODO (rik) leave out 'als lid'
    Es.notify_informacie('relation_begin', request.user, relation=relation_id)

    giedo.sync_async(request)
    return redirect_to_referer(request)
示例#4
0
def secr_add_group(request):
    if "secretariaat" not in request.user.cached_groups_names:
        raise PermissionDenied
    if request.method == "POST":
        form = AddGroupForm(request.POST)
        if form.is_valid():
            fd = form.cleaned_data
            nm = fd["name"]
            g = Es.Group(
                {
                    "types": ["group", "tag"],
                    "names": [nm],
                    "use_mailman_list": fd["true_group"],
                    "has_unix_group": fd["true_group"],
                    "humanNames": [{"name": nm, "human": fd["humanName"], "genitive_prefix": fd["genitive_prefix"]}],
                    "description": fd["description"],
                    "tags": [_id(fd["parent"])],
                }
            )
            logging.info("Added group %s" % nm)
            g.save()
            Es.notify_informacie("addgroup", request.user, entity=g._id)
            giedo.sync_async(request)
            messages.info(request, "Groep toegevoegd.")
            return HttpResponseRedirect(reverse("group-by-name", args=(nm,)))
    else:
        form = AddGroupForm()
    return render_to_response("leden/secr_add_group.html", {"form": form}, context_instance=RequestContext(request))
示例#5
0
文件: views.py 项目: Blackeel/kninfra
def untag(request):
    group, tag = _get_group_and_tag(request)
    if not Es.user_may_untag(request.user, group, tag):
        raise PermissionDenied

    group.untag(tag)
    Es.notify_informacie('untag', request.user, entity=group, tag=tag)
    giedo.sync_async(request)
    return redirect_to_referer(request)
示例#6
0
文件: views.py 项目: mrngm/kninfra
def untag(request):
    group, tag = _get_group_and_tag(request)
    if not Es.user_may_untag(request.user, group, tag):
        raise PermissionDenied

    group.untag(tag)
    Es.notify_informacie('untag', request.user, entity=group, tag=tag)
    giedo.sync_async(request)
    return redirect_to_referer(request)
示例#7
0
def entity_update_primary(data, request):
    """ Updates an entity
            >> (see below)

            << {ok: true}
          ( << {ok: false, error: "Permission denied"} ) """
    if 'id' not in data or not isinstance(data['id'], basestring):
        return {'ok': False, 'error': 'Missing argument "id"'}
    if 'type' not in data or not isinstance(data['type'], basestring):
        return {'ok': False, 'error': 'Missing argument "type"'}
    if 'new' not in data:
        return {'ok': False, 'error': 'Missing argument "new"'}
    new = data['new']
    typ = data['type']
    is_secretariaat = 'secretariaat' in request.user.cached_groups_names
    if not is_secretariaat:
        return {'ok': False, 'error': 'Permission denied'}
    if typ in ('email', 'telephone'):
        if not isinstance(new, basestring):
            return {'ok': False, 'error': '"new" should be a string'}
    elif typ == 'address':
        if not isinstance(new, dict):
            return {'ok': False, 'error': '"new" should be a dict'}
        for attr in ('street', 'number', 'zip', 'city'):
            if attr not in new or not isinstance(new[attr], basestring):
                return {
                    'ok': False,
                    'error': 'Missing argument "new.%s"' % attr
                }
    else:
        return {'ok': False, 'error': 'Unknown update type: "%s"' % typ}
    e = Es.by_id(data['id'])
    if e is None:
        return {'ok': False, 'error': 'Entity not found'}
    if (typ == 'email'):
        """ >> {action:"entity_update_primary_email",id:"4e6fcc85e60edf3dc0000270",
                    new:"*****@*****.**"} """
        if not email_re.match(new):
            return {'ok': False, 'error': 'Not valid e-mail address'}
        e.update_primary_email(new)
    elif (typ == 'telephone'):
        """ >> {action:"entity_update_primary_telephone",id:"4e6fcc85e60edf3dc0000270",
                    new:"+31611223344"} """
        if not len(new) > 9:
            return {'ok': False, 'error': 'Phone number is too short'}
        e.update_primary_telephone(new)
    elif (typ == 'address'):
        """ >> {action:"entity_update_address",id:"4e6fcc85e60edf3dc0000270",
                    street:"Street",
                    number:"23",
                    zip:"1234AA",
                    city:"Amsterdam"} """
        e.update_address(new['street'], new['number'], new['zip'], new['city'])
    else:
        return {'ok': False, 'error': 'Unknown update type: "%s"' % typ}
    giedo.sync_async(request)
    return {'ok': True}
示例#8
0
def entity_update_primary(data, request):
    """ Updates an entity
            >> (see below)

            << {ok: true}
          ( << {ok: false, error: "Permission denied"} ) """
    if 'id' not in data or not isinstance(data['id'], six.string_types):
        return {'ok': False, 'error': 'Missing argument "id"'}
    if 'type' not in data or not isinstance(data['type'], six.string_types):
        return {'ok': False, 'error': 'Missing argument "type"'}
    if 'new' not in data:
        return {'ok': False, 'error': 'Missing argument "new"'}
    new = data['new']
    typ = data['type']
    is_secretariaat = 'secretariaat' in request.user.cached_groups_names
    if not is_secretariaat:
        return {'ok': False, 'error': 'Permission denied'}
    if typ in ('email', 'telephone'):
        if not isinstance(new, six.string_types):
            return {'ok': False, 'error': '"new" should be a string'}
    elif typ == 'address':
        if not isinstance(new, dict):
            return {'ok': False, 'error': '"new" should be a dict'}
        for attr in ('street', 'number', 'zip', 'city'):
            if attr not in new or not isinstance(new[attr], six.string_types):
                return {
                    'ok': False,
                    'error': 'Missing argument "new.%s"' % attr}
    else:
        return {'ok': False, 'error': 'Unknown update type: "%s"' % typ}
    e = Es.by_id(data['id'])
    if e is None:
        return {'ok': False, 'error': 'Entity not found'}
    if (typ == 'email'):
        """ >> {action:"entity_update_email",id:"4e6fcc85e60edf3dc0000270",
                    new:"*****@*****.**"} """
        if not email_re.match(new):
            return {'ok': False, 'error': 'Not valid e-mail address'}
        e.update_email(new)
    elif (typ == 'telephone'):
        """ >> {action:"entity_update_telephone",id:"4e6fcc85e60edf3dc0000270",
                    new:"+31611223344"} """
        if not len(new) > 9:
            return {'ok': False, 'error': 'Phone number is too short'}
        e.update_telephone(new)
    elif (typ == 'address'):
        """ >> {action:"entity_update_address",id:"4e6fcc85e60edf3dc0000270",
                    street:"Street",
                    number:"23",
                    zip:"1234AA",
                    city:"Amsterdam"} """
        e.update_address(new['street'], new['number'], new['zip'], new['city'])
    else:
        return {'ok': False, 'error': 'Unknown update type: "%s"' % typ}
    giedo.sync_async(request)
    return {'ok': True}
示例#9
0
def relation_end(request, _id):
    rel = Es.relation_by_id(_id)
    if rel is None:
        raise Http404
    if not Es.user_may_end_relation(request.user, rel):
        raise PermissionDenied
    Es.end_relation(_id)

    # Notify informacie
    # TODO (rik) leave out 'als lid'
    Es.notify_informacie('relation_end', request.user, relation=_id)

    giedo.sync_async(request)
    return redirect_to_referer(request)
示例#10
0
文件: views.py 项目: Blackeel/kninfra
def relation_end(request, _id):
    rel = Es.relation_by_id(_id)
    if rel is None:
        raise Http404
    if not Es.relation_is_active(rel):
        messages.info(request, _("Relatie was al beëindigd."))
        return redirect_to_referer(request)
    if not Es.user_may_end_relation(request.user, rel):
        raise PermissionDenied
    Es.end_relation(_id)

    # Notify informacie
    # TODO (rik) leave out 'als lid'
    Es.notify_informacie('relation_end', request.user, relation=_id)

    giedo.sync_async(request)
    return redirect_to_referer(request)
示例#11
0
文件: views.py 项目: Jille/kninfra
def relation_end(request, _id):
    rel = Es.relation_by_id(_id)
    if rel is None:
        raise Http404
    if not Es.user_may_end_relation(request.user, rel):
        raise PermissionDenied
    Es.end_relation(_id)

    # Notify informacie
    if request.user == rel['who']:
        Es.notify_informacie('relation_ended', relation=_id)
    else:
        # TODO (rik) leave out 'als lid'
        Es.notify_informacie('relation_end', relation=_id)

    giedo.sync_async(request)
    return redirect_to_referer(request)
示例#12
0
def relation_end(request, _id):
    rel = Es.relation_by_id(_id)
    if rel is None:
        raise Http404
    if not Es.user_may_end_relation(request.user, rel):
        raise PermissionDenied
    Es.end_relation(_id)
    # Notify informacie
    if request.user == rel['who']:
        Es.notify_informacie("%s heeft zich uitgeschreven als %s %s" % (
                        request.user.full_name,
                        rel['how'].humanName if rel['how'] else 'lid',
                        rel['with'].humanName.genitive))
    else:
        # TODO (rik) leave out 'als lid'
        Es.notify_informacie("%s is geen %s meer %s" % (
                        rel['who'].humanName,
                        rel['how'].humanName if rel['how'] else 'lid',
                        rel['with'].humanName.genitive))
    giedo.sync_async(request)
    return redirect_to_referer(request)
示例#13
0
文件: views.py 项目: Blackeel/kninfra
def relation_begin(request):
    # TODO We should use Django forms, or better: use sweet Ajax
    d = {}
    for t in ('who', 'with', 'how'):
        if t not in request.POST:
            raise ValueError("Missing attr %s" % t)
        if t == 'how' and (not request.POST[t] or request.POST[t] == 'null'):
            d[t] = None
        else:
            d[t] = _id(request.POST[t])
    if not Es.user_may_begin_relation(request.user, d['who'], d['with'],
                                      d['how']):
        raise PermissionDenied

    # Check whether such a relation already exists
    dt = now()
    ok = False
    try:
        next(
            Es.query_relations(who=d['who'],
                               _with=d['with'],
                               how=d['how'],
                               _from=dt,
                               until=DT_MAX))
    except StopIteration:
        ok = True
    if not ok:
        messages.info(request, _("Deze relatie bestaat al"))
        return redirect_to_referer(request)

    # Add the relation!
    relation_id = Es.add_relation(d['who'], d['with'], d['how'], dt, DT_MAX)

    # Notify informacie
    # TODO (rik) leave out 'als lid'
    Es.notify_informacie('relation_begin', request.user, relation=relation_id)

    giedo.sync_async(request)
    return redirect_to_referer(request)
示例#14
0
文件: api.py 项目: aykevl/kninfra
def entity_update_visibility(data, request):
    """ Updates the visibility of a part of an entity (e.g. email,
        phone number...)
            Example:
            >> {action:"entity_update_visibility",
                id:"4e6fcc85e60edf3dc0000270",
                property: "telephone",
                visible: False}
            << {ok: true}
        or: << {ok: false, error: "Permission denied"}
    """

    if 'id' not in data or not isinstance(data['id'], six.string_types):
        return {'ok': False, 'error': 'Missing argument "id"'}
    if 'property' not in data or not isinstance(data['property'],
                                                six.string_types):
        return {'ok': False, 'error': 'Missing argument "property"'}
    if 'visible' not in data or not isinstance(data['visible'], bool):
        return {'ok': False, 'error': 'Missing argument "visible"'}

    is_secretariaat = 'secretariaat' in request.user.cached_groups_names
    is_user = data['id'] == request.user.id
    if not (is_secretariaat or is_user):
        return {'ok': False, 'error': 'Permission denied'}

    property = data['property']
    visible = data['visible']

    if property not in ['telephone']:
        return {'ok': False, 'error': 'Unknown property "%s"' % property}

    e = Es.by_id(data['id'])
    if e is None:
        return {'ok': False, 'error': 'Entity not found'}

    e.update_visibility_preference(property, visible)

    giedo.sync_async(request)
    return {'ok': True}
示例#15
0
def entity_update_visibility(data, request):
    """ Updates the visibility of a part of an entity (e.g. email, phone number...)
            Example:
            >> {action:"entity_update_visibility",id:"4e6fcc85e60edf3dc0000270",
                property: "telephone",
                visible: False}
            << {ok: true}
        or: << {ok: false, error: "Permission denied"}
    """

    if 'id' not in data or not isinstance(data['id'], basestring):
        return {'ok': False, 'error': 'Missing argument "id"'}
    if 'property' not in data or not isinstance(data['property'], basestring):
        return {'ok': False, 'error': 'Missing argument "property"'}
    if 'visible' not in data or not isinstance(data['visible'], bool):
        return {'ok': False, 'error': 'Missing argument "visible"'}

    is_secretariaat = 'secretariaat' in request.user.cached_groups_names
    is_user = data['id'] == request.user.id
    if not (is_secretariaat or is_user):
        return {'ok': False, 'error': 'Permission denied'}

    property = data['property']
    visible = data['visible']

    if property not in ['telephone']:
        return {'ok': False, 'error': 'Unknown property "%s"' % property}

    e = Es.by_id(data['id'])
    if e is None:
        return {'ok': False, 'error': 'Entity not found'}

    e.update_visibility_preference(property, visible)

    giedo.sync_async(request)
    return {'ok': True}
示例#16
0
def secr_add_user(request):
    if 'secretariaat' not in request.user.cached_groups_names:
        raise PermissionDenied
    if request.method == 'POST':
        form = AddUserForm(request.POST)
        if form.is_valid():
            fd = form.cleaned_data
            nm = find_name_for_user(fd['first_name'],
                        fd['last_name'])
            u = Es.User({
                'types': ['user'],
                'names': [nm],
                'humanNames': [{'human': fd['first_name']+' '+
                             fd['last_name']}],
                'person': {
                    'titles': [],
                    'nick': fd['first_name'],
                    'given': None,
                    'family': fd['last_name'],
                    'gender': fd['sex'],
                    'dateOfBirth': date_to_dt(
                        fd['dateOfBirth'])
                },
                'emailAddresses': [
                    {'email': fd['email'],
                     'from': DT_MIN,
                     'until': DT_MAX}],
                'addresses': [
                    {'street': fd['addr_street'],
                     'number': fd['addr_number'],
                     'zip': fd['addr_zip'],
                     'city': fd['addr_city'],
                     'from': DT_MIN,
                     'until': DT_MAX}],
                'telephones': [
                    {'number': fd['telephone'],
                     'from': DT_MIN,
                     'until': DT_MAX}],
                'studies': [
                    {'institute': _id(fd['study_inst']),
                     'study': _id(fd['study']),
                     'from': DT_MIN,
                     'until': DT_MAX,
                     'number': fd['study_number']}],
                'is_active': True,
                'password': None
                })
            logging.info("Added user %s" % nm)
            u.save()
            Es.add_relation(u, Es.id_by_name('leden',
                            use_cache=True),
                    _from=date_to_dt(fd['dateJoined']))
            for l in fd['addToList']:
                Es.add_relation(u, Es.id_by_name(l, use_cache=True),
                    _from=now())
            Es.notify_informacie("%s is ingeschreven als lid." % (
                        u.humanName))
            giedo.sync_async(request)
            request.user.push_message("Gebruiker toegevoegd. "+
                "Let op: hij heeft geen wachtwoord "+
                "en hij moet nog gemaild worden.")
            return HttpResponseRedirect(reverse('user-by-name',
                    args=(nm,)))
    else:
        form = AddUserForm()
    return render_to_response('leden/secr_add_user.html',
            {'form': form},
            context_instance=RequestContext(request))