예제 #1
0
파일: views.py 프로젝트: SUNET/meetingtools
def tag(request, rid):
    room = get_object_or_404(Room, pk=rid)
    if request.method == 'POST':
        form = TagRoomForm(request.POST)
        if form.is_valid():
            for tag in re.split('[,\s]+', form.cleaned_data['tag']):
                tag = tag.strip()
                ok, reason = _can_tag(request, tag)
                if ok:
                    Tag.objects.add_tag(room, tag)
                else:
                    form._errors['tag'] = form.error_class([u'%s ... please choose another tag!' % reason])
    else:
        form = TagRoomForm()

    tags = Tag.objects.get_for_object(room)
    tn = "+".join([t.name for t in tags])
    return respond_to(request,
                      {'text/html': "apps/room/tag.html"},
                      {'form': form,
                       'formtitle': 'Add Tag',
                       'cancelurl': '/rooms#%d' % room.id,
                       'cancelname': 'Done',
                       'submitname': 'Add Tag',
                       'room': room,
                       'tagstring': tn,
                       'tags': tags})
예제 #2
0
파일: views.py 프로젝트: SUNET/meetingtools
def create(request):
    acc = acc_for_user(request.user)
    my_meetings_sco = get_sco(acc, _user_meeting_folder(request, acc))
    template_sco_id = acc.default_template_sco_id
    if not template_sco_id:
        template_sco_id = settings.DEFAULT_TEMPLATE_SCO
    room = Room(creator=request.user, folder_sco=my_meetings_sco, source_sco=get_sco(acc, template_sco_id))
    what = "Create"
    title = "Create a new room"

    if request.method == 'POST':
        form = CreateRoomForm(request.POST, instance=room)
        _init_update_form(request, form, acc, my_meetings_sco)
        if form.is_valid():
            _update_room(request, room, form.cleaned_data)
            room = form.save()
            return redirect_to("/rooms#%d" % room.id)
    else:
        form = CreateRoomForm(instance=room)
        _init_update_form(request, form, acc, my_meetings_sco)

    return respond_to(request, {'text/html': 'apps/room/create.html'},
                      {'form': form,
                       'formtitle': title,
                       'cancelurl': '/rooms',
                       'cancelname': 'Cancel',
                       'submitname': '%s Room' % what})
예제 #3
0
파일: views.py 프로젝트: SUNET/meetingtools
def _goto(request, room, clean=True, promote=False):
    if room.is_locked():
        return respond_to(request, {"text/html": "apps/room/retry.html"}, {'room': room, 'wait': 10})

    now = time.time()
    lastvisit = room.lastvisit()
    room.lastvisited = datetime.now()

    with ac_api_client(room.sco.acc) as api:
        api.poll_user_counts(room)
    if clean:
        # don't clean the room unless you get a good status code from the call to the usermanager api above
        if room.self_cleaning and room.user_count == 0:
            if (room.user_count == 0) and (abs(lastvisit - now) > settings.GRACE):
                room.lock("Locked for cleaning")
                try:
                    room = _clean(request, room)
                finally:
                    room.unlock()

        if room.host_count == 0 and room.allow_host:
            return respond_to(request, {"text/html": "apps/room/launch.html"}, {'room': room})
    else:
        room.save()

    key = None
    if request.user.is_authenticated() and room.sco.acc.cross_domain_sso:
        key = _random_key(20)
        user_principal = api.find_user(request.user.username)
        principal_id = user_principal.get('principal-id')
        with ac_api_client(room.sco.acc) as api:
            api.request("user-update-pwd", {"user-id": principal_id, 'password': key, 'password-verify': key}, True)
            if promote and room.self_cleaning:
                if user_principal:
                    api.request('permissions-update',
                                {'acl-id': room.sco.sco_id, 'principal-id': user_principal.get('principal-id'),
                                 'permission-id': 'host'}, True)

    r = api.request('sco-info', {'sco-id': room.sco.sco_id}, True)
    urlpath = r.et.findtext('.//sco/url-path')
    start_user_counts_poll(room, 10)
    if key:
        try:
            user_client = ACPClient(room.sco.acc.api_url, request.user.username, key, cache=False)
            return user_client.redirect_to(room.sco.acc.url + urlpath)
        except Exception, e:
            pass
예제 #4
0
파일: views.py 프로젝트: SUNET/meetingtools
def occupation(request, rid):
    room = get_object_or_404(Room, pk=rid)
    with ac_api_client(room.sco.acc) as api:
        api.poll_user_counts(room)
        d = {'nusers': room.user_count, 'nhosts': room.host_count}
        return respond_to(request,
                          {'text/html': 'apps/room/fragments/occupation.txt',
                           'application/json': json_response(d, request)},
                          d)
예제 #5
0
파일: views.py 프로젝트: SUNET/meetingtools
def cluster(request, cluster_name=None):

    if not request.user.is_staff:
        return HttpResponseForbidden()

    clusters = ACCluster.objects.all().values('name')
    if cluster_name:
        acc = get_object_or_404(ACCluster, name=cluster_name)
        domains = cache.get('%s-domains' % acc)
        total_bytecount = cache.get('%s-bytecount' % acc)
        if not domains or not total_bytecount:
            domains, total_bytecount = tasks.get_cluster_content(acc)

        return respond_to(request, {'text/html': 'apps/content/cluster.html'},
                          {'clusters': clusters, 'cluster_name': cluster_name, 'domains': domains,
                           'total_bytecount': total_bytecount})

    return respond_to(request, {'text/html': 'apps/content/cluster.html'},
                      {'clusters': clusters})
예제 #6
0
파일: views.py 프로젝트: SUNET/meetingtools
def view(request, id):
    room = get_object_or_404(Room, pk=id)
    return respond_to(request,
                      {'text/html': 'apps/room/list.html'},
                      {'user': request.user,
                       'rooms': [room],
                       'title': room.name,
                       'baseurl': base_url(request),
                       'active': True,
                      })
예제 #7
0
파일: views.py 프로젝트: SUNET/meetingtools
def go_by_path(request, path):
    rooms = Room.objects.filter(urlpath=path)
    if len(rooms) == 1:
        return goto(request, rooms[0])

    if len(rooms) == 0:
        return HttpResponseNotFound()

    return respond_to(request,
                      {'text/html': 'apps/room/choose.html',
                       'application/json': json_response([base_url(request, room.go_url()) for room in rooms])},
                      {'rooms': rooms})
예제 #8
0
파일: views.py 프로젝트: SUNET/meetingtools
def user(request, username=None):
    if username is None:
        username = request.user.username
    content = cache.get('%s-content' % username)
    total_bytecount = cache.get('%s-bytecount' % username)
    if not content or total_bytecount:
        content = Content.objects.filter(creator__username=username)
        total_bytecount = content.aggregate(Sum('bytecount'))
        cache.set('%s-content' % username, content, 900)
        cache.set('%s-bytecount' % username, total_bytecount, 900)
    return respond_to(request, {'text/html': 'apps/content/user.html'},
                      {'username': username, 'content': content, 'total_bytecount': total_bytecount})
예제 #9
0
파일: views.py 프로젝트: SUNET/meetingtools
def domain(request, domain_name):

    if not request.user.is_staff:
        return HttpResponseForbidden()

    domain_tag = get_object_or_404(Tag, name='domain:%s' % domain_name)
    users = cache.get('%s-users' % domain_tag)
    total_files = cache.get('%s-files' % domain_tag)
    total_bytecount = cache.get('%s-bytecount' % domain_tag)
    if not users or not total_files or not total_bytecount:
        users, total_files, total_bytecount = tasks.get_domain_content(domain_tag)

    return respond_to(request, {'text/html': 'apps/content/domain.html'},
                      {'domain': domain_name, 'total_bytecount': total_bytecount, 'total_files': total_files,
                       'users': users})
예제 #10
0
파일: views.py 프로젝트: SUNET/meetingtools
def list_by_tag(request, tn):
    tags = tn.split('+')
    rooms = TaggedItem.objects.get_by_model(Room, tags).order_by('name').all().prefetch_related("creator", "sco",
                                                                                                "folder_sco",
                                                                                                "source_sco",
                                                                                                "deleted_sco")
    title = 'Rooms tagged with %s' % " and ".join(tags)
    return respond_to(request,
                      {'text/html': 'apps/room/list.html',
                       'application/json': json_response([_room2dict(request, room) for room in rooms], request)},
                      {'title': title,
                       'description': title,
                       'edit': False,
                       'active': len(rooms) == 1,
                       'baseurl': base_url(request),
                       'tagstring': tn,
                       'rooms': rooms})
예제 #11
0
파일: views.py 프로젝트: SUNET/meetingtools
def list_rooms(request, username=None):
    user = request.user
    if username:
        try:
            user = User.objects.get(username=username)
        except ObjectDoesNotExist:
            user = None

    rooms = []
    if user:
        rooms = Room.objects.filter(creator=user).order_by('name').all().prefetch_related("creator", "sco",
                                                                                          "folder_sco", "source_sco",
                                                                                          "deleted_sco")

    return respond_to(request,
                      {'text/html': 'apps/room/list.html'},
                      {'title': 'Your Rooms', 'edit': True, 'active': len(rooms) == 1, 'rooms': rooms})
예제 #12
0
파일: views.py 프로젝트: SUNET/meetingtools
def update(request, id):
    room = get_object_or_404(Room, pk=id)
    acc = room.sco.acc
    what = "Update"
    title = "Modify %s" % room.name

    if request.method == 'POST':
        form = ModifyRoomForm(request.POST, instance=room)
        _init_update_form(request, form, acc, room.folder_sco)
        if form.is_valid():
            _update_room(request, room, form.cleaned_data)
            room = form.save()
            return redirect_to("/rooms#%d" % room.id)
    else:
        form = ModifyRoomForm(instance=room)
        _init_update_form(request, form, acc, room.folder_sco)

    return respond_to(request, {'text/html': 'apps/room/update.html'},
                      {'form': form,
                       'formtitle': title,
                       'cancelurl': '/rooms#%d' % room.id,
                       'cancelname': 'Cancel',
                       'submitname': '%s Room' % what})
예제 #13
0
파일: views.py 프로젝트: SUNET/meetingtools
def delete(request, id):
    room = get_object_or_404(Room, pk=id)
    if request.method == 'POST':
        form = DeleteRoomForm(request.POST)
        if form.is_valid():
            with ac_api_client(room.sco.acc) as api:
                api.request('sco-delete', {'sco-id': room.sco.sco_id}, raise_error=False)
                #clear_acl(room)
                #room.sco.delete()
                #if room.folder_sco is not None:
                #room.folder_sco.delete()
                #if room.deleted_sco is not None:
                #room.deleted_sco.delete()
            room.delete()
            return redirect_to("/rooms")
    else:
        form = DeleteRoomForm()

    return respond_to(request, {'text/html': 'edit.html'},
                      {'form': form,
                       'formtitle': 'Delete %s' % room.name,
                       'cancelurl': '/rooms',
                       'cancelname': 'Cancel',
                       'submitname': 'Delete Room'})
예제 #14
0
파일: views.py 프로젝트: SUNET/meetingtools
def user(request,username=None):
    if username is None:
        username = request.user.username
    (local,domain) = username.split('@')
    return respond_to(request,{'text/html': 'apps/stats/user.html'},{'domain': domain,'username': username})
예제 #15
0
파일: views.py 프로젝트: SUNET/meetingtools
def recordings(request, rid):
    room = get_object_or_404(Room, pk=rid)
    return respond_to(request,
                      {'text/html': 'apps/room/recordings.html'},
                      {'recordings': room_recordings(request, room), 'room': room})
예제 #16
0
파일: views.py 프로젝트: SUNET/meetingtools
def widget(request, tags=None):
    title = 'Meetingtools jQuery widget'
    return respond_to(request, {'text/html': 'apps/room/widget.html'}, {'title': title, 'tags': tags})
예제 #17
0
파일: views.py 프로젝트: SUNET/meetingtools
def room(request,rid):
    room = get_object_or_404(Room,pk=rid)
    if not room.creator == request.user:
        return HttpResponseForbidden("You can only look at statistics for your own rooms!")
    
    return respond_to(request,{'text/html': 'apps/stats/room.html'},{'room': room})
예제 #18
0
파일: views.py 프로젝트: SUNET/meetingtools
def domain(request,domain):
    (l,d) = request.user.username.split('@')
    if d != domain:
        return HttpResponseForbidden("You can only look at statistics for your own domain!")
    
    return respond_to(request,{'text/html': 'apps/stats/domain.html'},{'domain': domain})