def add_thread(request, suggested_label=None): if request.POST: form = get_add_form()(request.POST) if form.is_valid(): group_id = get_integer(request, "group_id") user_id = get_integer(request, "user_id") if group_id: owner_group = Group.objects.get(pk=group_id) check_access(request.user, obj=owner_group, command="add thread") thread = Thread.objects.create( owner_group=owner_group, owner_user=request.user, name=form.cleaned_data["name"], last_changed_by=request.user, last_changed_time=datetime.now(), ) Watcher.objects.create( user=request.user, object_id=thread.id, owner_user=request.user, owner_group=owner_group, content_type=ContentType.objects.get(name="thread"), ) else: owner_group = request.community check_access(request.user, obj=owner_group, command="add thread") thread = Thread.objects.create( owner_group=owner_group, owner_user=request.user, name=form.cleaned_data["name"], last_changed_by=request.user, last_changed_time=datetime.now(), ) Watcher.objects.create( user=request.user, object_id=thread.id, owner_user=request.user, owner_group=owner_group, content_type=ContentType.objects.get(name="thread"), ) if form.cleaned_data["first_message"] != "": import re replacer = re.compile(" ") body = form.cleaned_data["first_message"] body = replacer.sub(" ", body) Message.objects.create(body=body, parent_thread=thread, owner=request.user) # Handle the labels handle_labels(request, thread) return HttpResponseRedirect(thread.get_absolute_url()) labels = get_string(request, "labels", default="") form = get_add_form()(initial={"title": "", "contents": "", "labels": labels}) return render_to_response(request, "forums/add.html", {"form": form})
def delete_message(request, message_id): message = get_object_or_404(Message, pk=message_id) if message.owner != request.user: check_access(request.user, obj=message.parent_thread, command='administrate thread') new_messages = Message.objects.filter( parent_thread=message.parent_thread, creation_time__gt=message.creation_time, deleted=False).count() thread = message.parent_thread if new_messages != 0: check_access(request.user, command='administrate thread', obj=thread) delete_object(message) Thread.objects.filter(pk=thread.id).update(count=F('number_of_replies') + 1) if thread.number_of_replies == 0: delete_object(thread) # disconnect replies for reply in Message.objects.filter(parent_message=message): reply.parent_message = None reply.save() from django.utils.simplejson import dumps return HttpResponse(dumps([message.id], ensure_ascii=False), content_type='text/json; charset=UTF-8')
def delete_message(request, message_id): message = get_object_or_404(Message, pk=message_id) if message.owner != request.user: check_access(request.user, obj=message.parent_thread, command="administrate thread") new_messages = Message.objects.filter( parent_thread=message.parent_thread, creation_time__gt=message.creation_time, deleted=False ).count() thread = message.parent_thread if new_messages != 0: check_access(request.user, command="administrate thread", obj=thread) delete_object(message) Thread.objects.filter(pk=thread.id).update(count=F("number_of_replies") + 1) if thread.number_of_replies == 0: delete_object(thread) # disconnect replies for reply in Message.objects.filter(parent_message=message): reply.parent_message = None reply.save() from django.utils.simplejson import dumps return HttpResponse(dumps([message.id], ensure_ascii=False), content_type="text/json; charset=UTF-8")
def handle_invites(inviter, group, users, groups=[]): for user in users: check_access(user=inviter, obj=user, command='view') try: answer = Invite.objects.get(inviter=inviter, group=group, user=user) if answer.choice == "N": answer.delete() Invite.objects.create(inviter=inviter, group=group, user=user) except Invite.DoesNotExist: Invite.objects.create(inviter=inviter, group=group, user=user)
def get_object_or_404_and_check_access(request, klass, **kwargs): from django.shortcuts import get_object_or_404 command = None if 'command' in kwargs: command = kwargs['command'] del kwargs['command'] obj = get_object_or_404(klass, **kwargs) from curia import get_community_of if get_community_of(obj) != request.community: from curia.authentication import WrongCommunityException raise WrongCommunityException(obj) check_access(request.user, obj, level=2, command=command) return obj
def add_group(request): meta_community = request.community.meta class GroupForm(django.forms.Form): name = django.forms.CharField(label=_('Name')) #labels = django.forms.CharField(required=False, label=_('Labels')) #logo = django.forms.ImageField(widget = django.forms.FileInput, required=False, label=_('Logo')) check_access(request.user, command='add group') error = 0 if request.POST: new_data = request.POST.copy() new_data.update(request.FILES) form = GroupForm(new_data) if form.is_valid(): error = None if error == None: try: new_group = Group.objects.create( name=form.cleaned_data['name']) meta_group = MetaGroup.objects.create( group=new_group, created_by=request.user) meta_community.children.add(meta_group) meta_community.save() content_type = get_content_type(new_group) except: error = _( "There is already a group with this name. Please choose another one." ) if error == None: try: presentation = Document.objects.get( owner_group=new_group, owner_user__isnull=True, is_presentation=True) except Document.DoesNotExist: presentation = Document.objects.create( owner_group=new_group, is_presentation=True) name = new_group.name if name.endswith('s'): title = new_group.name + ' presentation' else: title = new_group.name + 's presentation' new_version = Version( document=presentation, title=title, contents=_('Write a presentation why don\'t ya?'), owner=request.user) new_version.save() watcher = Watcher(user=request.user, owner_group=new_group, inverse=False) watcher.save() django.forms.models.save_instance(form, meta_group) new_group.user_set.add(request.user) UserPermission.objects.create( user=request.user, command='add', content_type=get_content_type(new_group), object_id=new_group.id) UserPermission.objects.create( user=request.user, command='delete', content_type=get_content_type(new_group), object_id=new_group.id) UserPermission.objects.create( user=request.user, command='view', content_type=get_content_type(new_group), object_id=new_group.id) UserPermission.objects.create( user=request.user, command='edit', content_type=get_content_type(new_group), object_id=new_group.id) #Handle the labels handle_labels(request, new_group) return HttpResponseRedirect('/administration/') return render_to_response(request, 'authentication/add_group.html', { 'form': form, 'error': error }) else: form = GroupForm() return render_to_response(request, 'authentication/add_group.html', {'form': form})
def view_forum(request, group_id=None, suggested_label_title=None, page=None): if group_id: group = get_object_or_404_and_check_access(request, Group, pk=group_id, command="view") else: group = request.community check_access(request.user, group, "view") page_size = get_integer(request, "page_size", default=12) search = get_string(request, "search", default="") suggested_labels = get_objects_from( SuggestedLabel, deleted=False, group=group_id, content_type=get_content_type(Thread) ) import django.forms class SearchForm(django.forms.Form): search = django.forms.CharField(max_length=2048, label=_("Search"), required=False) if request.POST: form = SearchForm(request.POST) if form.is_valid(): if "create_thread" in request.REQUEST and request.REQUEST["create_thread"] == _("Create thread"): return HttpResponseRedirect( "/forums/add/?group_id=%s&labels=%s" % (group.id, get_string(request, "fastsearch", default="")) ) return HttpResponseRedirect( "/forums/%s/?search=%s&fastsearch=%s" % (group_id, search, get_string(request, "fastsearch", default="")) ) else: form = SearchForm(initial={"search": search}) full_search = search + "," + get_string(request, "fastsearch", default="") if full_search == ",": full_search = "" threads = search_objects_from(full_search, Thread, owner_group=group) paginator = Paginator(threads.order_by("-last_changed_time"), page_size) number_of_pages = paginator.num_pages got_page_size = False if number_of_pages != 0: if not page: page = 1 page = int(page) # TODO: implement getting page ranges # end_page = int(request.GET['end_page']) end_page = page threads = paginator.page(page) else: end_page = 0 page = 0 threads = [] next_page = page + 1 has_next_page = paginator.page(page).has_next() on_all = True for suggested_label in suggested_labels: if suggested_label.title == get_string(request, "fastsearch", default=""): on_all = False return render_to_response( request, "forums/view_forum.html", { "base_url": "/forums/" + str(group.id) + "/", "is_paginated": True, "form": form, "threads": threads, "suggested_labels": suggested_labels, "group": group, "number_of_pages": number_of_pages, "page": page, "end_page": end_page, "has_next_page": has_next_page, "has_previous_page": paginator.page(page).has_previous(), "next_page": next_page, "previous_page": page - 1, "page_size": page_size, "search": search, "fastsearch": get_string(request, "fastsearch", default=""), "on_all": on_all, "paginator": paginator, "add_form": get_add_form()(initial={}), }, )
def view_thread(request, thread_id, page=None): thread = get_object_or_404_and_check_access(request, Thread, pk=thread_id, command="view") page_size = get_integer(request, "page_size", default=12) orphans = 10 try: set_time_on(thread, request.user, datetime_from_string(request.GET["set_time"])) set_time = False except KeyError: set_time = True last_viewed = get_time_from(thread, request.user).last_viewed try: time = datetime_from_string(request.GET["time"]) except KeyError: time = last_viewed message_query = Message.objects.filter(parent_thread__pk=thread_id) show_deleted = get_boolean(request, "show_deleted") if not show_deleted: message_query = message_query.filter(deleted=show_deleted) threaded = get_boolean(request, "threaded", settings.THREADED_FORUMS) if threaded: message_order_by = "cache_hierarchy" else: message_order_by = "creation_time" paginator = Paginator(message_query.order_by(message_order_by), page_size, orphans=orphans) number_of_pages = paginator.num_pages got_page_size = False if number_of_pages != 0: if not page: page = number_of_pages page = int(page) # TODO: implement getting page ranges # end_page = int(request.GET['end_page']) end_page = page messages = paginator.page(page) else: end_page = 0 page = 0 messages = [] next_page = page + 1 has_next_page = paginator.page(page).has_next() messages = list(messages.object_list) if threaded: try: # get "first" (i.e. the upper most on the page) new message: the message with lowest cache_hierarchy, of the messages that have a timestamp set after "time" if time is None: time = datetime.fromordinal(1) first_message = Message.objects.filter(parent_thread=thread, creation_time__gt=time).order_by( message_order_by )[0] # if we didn't get an explicit request for a specific page and the current page does not include the "first" (i.e. the upper most on the page) unread message if not got_page_size: while first_message not in messages and page > 1: # extend one page end_page = page page -= 1 tmp = messages messages = paginator.page(page).object_list messages.extend(tmp) # set firstnew on the first unread message in the page for message in messages: if time is None or message.creation_time >= last_viewed: message.firstnew = True break except IndexError: # for correct scrolling: set firstnew flag on the last message if there are no unread messages if len(messages) != 0: messages[-1].firstnew = True else: # not threaded has_unread = False # set firstnew on the first unread message in the page for message in messages: if time is None or message.creation_time >= last_viewed: message.firstnew = True has_unread = True break # for correct scrolling: set firstnew flag on the last message if there are no unread messages if not has_unread: messages[-1].firstnew = True # If this is in a forum, get list of suggested_labels. suggested_label = None parents = None forum = False if thread.owner_group is None: forum = True parents = [] try: suggested_label = request.GET["suggested_label"] tp = SuggestedLabel.objects.get(title=suggested_label) except (KeyError, SuggestedLabel.DoesNotExist): tp = None suggested_label = tp suggested_labels = get_objects_from(SuggestedLabel, deleted=False, parent=tp) if tp == None: pass else: if tp.parent: has_parent = True while has_parent: parents.append(tp.parent) m = tp.parent if not m.parent: has_parent = False tp = tp.parent parents.reverse() # Add message import django.forms class EditForm(django.forms.Form): body = django.forms.CharField(widget=django.forms.Textarea, label=_("Message")) parent_message = None if request.REQUEST.has_key("parent_message_id") and request.REQUEST["parent_message_id"] != "": parent_message = Message.objects.get(pk=request.REQUEST["parent_message_id"]) if request.method == "POST": form = EditForm(request.POST) check_access( request.user, command="add message", obj=thread ) # NOTE: same command in message.html and view_thread.html if form.is_valid(): import re replacer = re.compile(" ") body = form.cleaned_data["body"] body = replacer.sub(" ", body) if body != "": Message.objects.create( parent_thread=thread, parent_message=parent_message, owner=request.user, body=body ) thread.last_changed_by = request.user thread.last_changed_time = datetime.now() thread.save() Thread.objects.filter(pk=thread.id).update(count=F("number_of_replies") + 1) set_time_on(thread, user=None) try: Watcher.objects.get( object_id=thread.id, user=request.user, content_type=ContentType.objects.get(name="thread") ) except Watcher.DoesNotExist: Watcher.objects.create( user=request.user, object_id=thread.id, owner_user=request.user, owner_group=request.community, content_type=ContentType.objects.get(name="thread"), ) return HttpResponseRedirect(thread.get_absolute_url() + "?time=" + str(time) + "#firstnew") else: form = EditForm(initial={}) return render_to_response( request, "forums/view_thread.html", { "watch_object": thread, "thread": thread, "messages": messages, "number_of_pages": number_of_pages, "page": page, "end_page": end_page, "has_next_page": has_next_page, "has_previous_page": paginator.page(page).has_previous(), "next_page": next_page, "previous_page": page - 1, "page_size": page_size, "show_deleted": show_deleted, "time": time, "set_time": set_time, "owner": get_owner(thread), "suggested_label": suggested_label, "parents": parents, "forum": forum, "form": form, "is_paginated": True, "base_url": thread.get_absolute_url(), "threaded": threaded, "number_of_replies": thread.number_of_replies, "current_user": request.user, "paginator": paginator, }, )
def add_thread(request, suggested_label=None): if request.POST: form = get_add_form()(request.POST) if form.is_valid(): group_id = get_integer(request, 'group_id') user_id = get_integer(request, 'user_id') if group_id: owner_group = Group.objects.get(pk=group_id) check_access(request.user, obj=owner_group, command='add thread') thread = Thread.objects.create( owner_group=owner_group, owner_user=request.user, name=form.cleaned_data['name'], last_changed_by=request.user, last_changed_time=datetime.now()) Watcher.objects.create( user=request.user, object_id=thread.id, owner_user=request.user, owner_group=owner_group, content_type=ContentType.objects.get(name="thread")) else: owner_group = request.community check_access(request.user, obj=owner_group, command='add thread') thread = Thread.objects.create( owner_group=owner_group, owner_user=request.user, name=form.cleaned_data['name'], last_changed_by=request.user, last_changed_time=datetime.now()) Watcher.objects.create( user=request.user, object_id=thread.id, owner_user=request.user, owner_group=owner_group, content_type=ContentType.objects.get(name="thread")) if form.cleaned_data['first_message'] != '': import re replacer = re.compile(' ') body = form.cleaned_data['first_message'] body = replacer.sub(' ', body) Message.objects.create(body=body, parent_thread=thread, owner=request.user) #Handle the labels handle_labels(request, thread) return HttpResponseRedirect(thread.get_absolute_url()) labels = get_string(request, 'labels', default='') form = get_add_form()(initial={ 'title': '', 'contents': '', 'labels': labels }) return render_to_response(request, 'forums/add.html', {'form': form})
def view_forum(request, group_id=None, suggested_label_title=None, page=None): if group_id: group = get_object_or_404_and_check_access(request, Group, pk=group_id, command='view') else: group = request.community check_access(request.user, group, 'view') page_size = get_integer(request, 'page_size', default=12) search = get_string(request, 'search', default='') suggested_labels = get_objects_from(SuggestedLabel, deleted=False, group=group_id, content_type=get_content_type(Thread)) import django.forms class SearchForm(django.forms.Form): search = django.forms.CharField(max_length=2048, label=_('Search'), required=False) if request.POST: form = SearchForm(request.POST) if form.is_valid(): if 'create_thread' in request.REQUEST and request.REQUEST[ 'create_thread'] == _('Create thread'): return HttpResponseRedirect( '/forums/add/?group_id=%s&labels=%s' % (group.id, get_string(request, 'fastsearch', default=''))) return HttpResponseRedirect( '/forums/%s/?search=%s&fastsearch=%s' % (group_id, search, get_string( request, 'fastsearch', default=''))) else: form = SearchForm(initial={'search': search}) full_search = search + ',' + get_string(request, 'fastsearch', default='') if full_search == ',': full_search = '' threads = search_objects_from(full_search, Thread, owner_group=group) paginator = Paginator(threads.order_by('-last_changed_time'), page_size) number_of_pages = paginator.num_pages got_page_size = False if number_of_pages != 0: if not page: page = 1 page = int(page) # TODO: implement getting page ranges #end_page = int(request.GET['end_page']) end_page = page threads = paginator.page(page) else: end_page = 0 page = 0 threads = [] next_page = page + 1 has_next_page = paginator.page(page).has_next() on_all = True for suggested_label in suggested_labels: if suggested_label.title == get_string(request, 'fastsearch', default=''): on_all = False return render_to_response( request, 'forums/view_forum.html', { 'base_url': '/forums/' + str(group.id) + '/', 'is_paginated': True, 'form': form, 'threads': threads, 'suggested_labels': suggested_labels, 'group': group, 'number_of_pages': number_of_pages, 'page': page, 'end_page': end_page, 'has_next_page': has_next_page, 'has_previous_page': paginator.page(page).has_previous(), 'next_page': next_page, 'previous_page': page - 1, 'page_size': page_size, 'search': search, 'fastsearch': get_string(request, 'fastsearch', default=''), 'on_all': on_all, 'paginator': paginator, 'add_form': get_add_form()(initial={}) })
def view_thread(request, thread_id, page=None): thread = get_object_or_404_and_check_access(request, Thread, pk=thread_id, command='view') page_size = get_integer(request, 'page_size', default=12) orphans = 10 try: set_time_on(thread, request.user, datetime_from_string(request.GET['set_time'])) set_time = False except KeyError: set_time = True last_viewed = get_time_from(thread, request.user).last_viewed try: time = datetime_from_string(request.GET['time']) except KeyError: time = last_viewed message_query = Message.objects.filter(parent_thread__pk=thread_id) show_deleted = get_boolean(request, 'show_deleted') if not show_deleted: message_query = message_query.filter(deleted=show_deleted) threaded = get_boolean(request, 'threaded', settings.THREADED_FORUMS) if threaded: message_order_by = 'cache_hierarchy' else: message_order_by = 'creation_time' paginator = Paginator(message_query.order_by(message_order_by), page_size, orphans=orphans) number_of_pages = paginator.num_pages got_page_size = False if number_of_pages != 0: if not page: page = number_of_pages page = int(page) # TODO: implement getting page ranges #end_page = int(request.GET['end_page']) end_page = page messages = paginator.page(page) else: end_page = 0 page = 0 messages = [] next_page = page + 1 has_next_page = paginator.page(page).has_next() messages = list(messages.object_list) if threaded: try: # get "first" (i.e. the upper most on the page) new message: the message with lowest cache_hierarchy, of the messages that have a timestamp set after "time" if time is None: time = datetime.fromordinal(1) first_message = Message.objects.filter( parent_thread=thread, creation_time__gt=time).order_by(message_order_by)[0] # if we didn't get an explicit request for a specific page and the current page does not include the "first" (i.e. the upper most on the page) unread message if not got_page_size: while first_message not in messages and page > 1: # extend one page end_page = page page -= 1 tmp = messages messages = paginator.page(page).object_list messages.extend(tmp) # set firstnew on the first unread message in the page for message in messages: if time is None or message.creation_time >= last_viewed: message.firstnew = True break except IndexError: # for correct scrolling: set firstnew flag on the last message if there are no unread messages if len(messages) != 0: messages[-1].firstnew = True else: # not threaded has_unread = False # set firstnew on the first unread message in the page for message in messages: if time is None or message.creation_time >= last_viewed: message.firstnew = True has_unread = True break # for correct scrolling: set firstnew flag on the last message if there are no unread messages if not has_unread: messages[-1].firstnew = True # If this is in a forum, get list of suggested_labels. suggested_label = None parents = None forum = False if thread.owner_group is None: forum = True parents = [] try: suggested_label = request.GET['suggested_label'] tp = SuggestedLabel.objects.get(title=suggested_label) except (KeyError, SuggestedLabel.DoesNotExist): tp = None suggested_label = tp suggested_labels = get_objects_from(SuggestedLabel, deleted=False, parent=tp) if tp == None: pass else: if tp.parent: has_parent = True while has_parent: parents.append(tp.parent) m = tp.parent if not m.parent: has_parent = False tp = tp.parent parents.reverse() #Add message import django.forms class EditForm(django.forms.Form): body = django.forms.CharField(widget=django.forms.Textarea, label=_('Message')) parent_message = None if request.REQUEST.has_key('parent_message_id') and request.REQUEST[ 'parent_message_id'] != '': parent_message = Message.objects.get( pk=request.REQUEST['parent_message_id']) if request.method == 'POST': form = EditForm(request.POST) check_access( request.user, command='add message', obj=thread ) # NOTE: same command in message.html and view_thread.html if form.is_valid(): import re replacer = re.compile(' ') body = form.cleaned_data['body'] body = replacer.sub(' ', body) if body != '': Message.objects.create(parent_thread=thread, parent_message=parent_message, owner=request.user, body=body) thread.last_changed_by = request.user thread.last_changed_time = datetime.now() thread.save() Thread.objects.filter(pk=thread.id).update( count=F('number_of_replies') + 1) set_time_on(thread, user=None) try: Watcher.objects.get( object_id=thread.id, user=request.user, content_type=ContentType.objects.get(name="thread")) except Watcher.DoesNotExist: Watcher.objects.create( user=request.user, object_id=thread.id, owner_user=request.user, owner_group=request.community, content_type=ContentType.objects.get(name="thread")) return HttpResponseRedirect(thread.get_absolute_url() + '?time=' + str(time) + '#firstnew') else: form = EditForm(initial={}) return render_to_response( request, 'forums/view_thread.html', { 'watch_object': thread, 'thread': thread, 'messages': messages, 'number_of_pages': number_of_pages, 'page': page, 'end_page': end_page, 'has_next_page': has_next_page, 'has_previous_page': paginator.page(page).has_previous(), 'next_page': next_page, 'previous_page': page - 1, 'page_size': page_size, 'show_deleted': show_deleted, 'time': time, 'set_time': set_time, 'owner': get_owner(thread), 'suggested_label': suggested_label, 'parents': parents, 'forum': forum, 'form': form, 'is_paginated': True, 'base_url': thread.get_absolute_url(), 'threaded': threaded, 'number_of_replies': thread.number_of_replies, 'current_user': request.user, 'paginator': paginator })
def add_group(request): meta_community = request.community.meta class GroupForm(django.forms.Form): name = django.forms.CharField(label=_('Name')) #labels = django.forms.CharField(required=False, label=_('Labels')) #logo = django.forms.ImageField(widget = django.forms.FileInput, required=False, label=_('Logo')) check_access(request.user, command='add group') error = 0 if request.POST: new_data = request.POST.copy() new_data.update(request.FILES) form = GroupForm(new_data) if form.is_valid(): error = None if error == None: try: new_group = Group.objects.create(name=form.cleaned_data['name']) meta_group = MetaGroup.objects.create(group=new_group, created_by=request.user) meta_community.children.add(meta_group) meta_community.save() content_type = get_content_type(new_group) except: error = _("There is already a group with this name. Please choose another one.") if error == None: try: presentation = Document.objects.get(owner_group=new_group, owner_user__isnull=True, is_presentation=True) except Document.DoesNotExist: presentation = Document.objects.create(owner_group=new_group, is_presentation=True) name = new_group.name if name.endswith('s'): title=new_group.name+' presentation' else: title = new_group.name+'s presentation' new_version = Version(document=presentation,title=title, contents=_('Write a presentation why don\'t ya?'), owner=request.user) new_version.save() watcher = Watcher(user=request.user, owner_group=new_group, inverse=False) watcher.save() django.forms.models.save_instance(form, meta_group) new_group.user_set.add(request.user) UserPermission.objects.create(user=request.user, command='add', content_type=get_content_type(new_group), object_id=new_group.id) UserPermission.objects.create(user=request.user, command='delete', content_type=get_content_type(new_group), object_id=new_group.id) UserPermission.objects.create(user=request.user, command='view', content_type=get_content_type(new_group), object_id=new_group.id) UserPermission.objects.create(user=request.user, command='edit', content_type=get_content_type(new_group), object_id=new_group.id) #Handle the labels handle_labels(request,new_group) return HttpResponseRedirect('/administration/') return render_to_response(request, 'authentication/add_group.html', {'form':form, 'error':error}) else: form = GroupForm() return render_to_response(request, 'authentication/add_group.html', {'form':form})