def history(request, id = None): """ Show history list or display diff between two versions """ snippet = get_object_or_404(Snippet, pk=id) if request.GET.get('v'): version = int(request.GET['v']) if version == 0: body = snippet.highlight(snippet.body, get_lexer_by_name(snippet.lexer)) else: ver = get_object_or_404(SnippetVersion, snippet = snippet, version=version) body = snippet.highlight(ver.body, get_lexer_by_name(snippet.lexer)) return render_to_response('snippets/version.html', {'snippet': snippet, 'version': version, 'body': body, 'lines': range(1, body.count('\n'))}, context_instance=build_context(request)) elif request.GET.get('v1') and request.GET.get('v2'): version1 = int(request.GET['v1']) version2 = int(request.GET['v2']) if version1 == 0: version1_label = 'current' body_1 = snippet.body else: version1_label = 'v' + str(version1) body_1 = get_object_or_404(SnippetVersion, snippet = snippet, version=version1).body if version2 == 0: version2_label = 'current' body_2 = snippet.body else: version2_label = 'v' + str(version2) body_2 = get_object_or_404(SnippetVersion, snippet = snippet, version=version2).body fromlines = str(body_1).splitlines(True) tolines = str(body_2).splitlines(True) debug(fromlines) debug(tolines) if len(fromlines) >= len(tolines): no = len(fromlines) else: no = len(tolines) diffbody = '' for line in difflib.unified_diff(fromlines, tolines, fromfile=version1_label, tofile=version2_label): diffbody = diffbody + str(line) diffbody = snippet.highlight(diffbody, get_lexer_by_name('diff')) return render_to_response('snippets/diff.html', { 'snippet': snippet, 'version1': version1, 'version2': version2, 'diffbody': diffbody, 'lines': range(1, diffbody.count('\n')) }, context_instance=build_context(request)) else: snippet_versions = SnippetVersion.objects.filter(snippet = snippet).all() return render_to_response('snippets/history_index.html', {'snippet': snippet, 'snippet_versions': snippet_versions}, context_instance=build_context(request))
def create(request): data = {} if request.method == 'POST': data['form'] = SnippetForm(request.POST) # A form bound to the POST data if data['form'].is_valid(): formData = data['form'].save(commit = False) formData.author = request.user if not formData.lexer: try: lexer = guess_lexer(formData.body) for lex in LEXERS.itervalues(): if lexer.name == lex[1]: formData.lexer = lex[2][0].lower() except ClassNotFound: formData.lexer = u'text' if 'preview' in request.POST: data['title'] = formData.title; data['preview_body'] = highlight(formData.body, get_lexer_by_name(formData.lexer), HtmlFormatter(cssclass = 'source')) data['lines'] = range(1, formData.body.count('\n') + 2) return render_to_response('snippets/process.html', data, context_instance=build_context(request)) else:#save - notify followers this user and have the option on formData.body = str(formData.body).replace("\r\n","\n") formData.save() try: followers = UserFollow.objects.select_related().filter(followed_user=request.user).all() except: followers = None if followers: # this is very inneficient - find some other way for follower in followers: profile = follower.user.get_profile(); if profile.followed_user_created: #User wants to recieve a notification queue = EmailQueue( mail_to=follower.user.email, mail_subject="Followed user created a new snippet", mail_body=render_to_string('emails/followed_user_created.txt', { 'user': follower.user, 'username': request.user.username, 'SITE': request.META['HTTP_HOST']} ) ) queue.save() request.session['flash'] = ['#' + str(formData.pk) +' created successfuly', 'success'] return HttpResponseRedirect('/accounts/profile/') # Redirect after POST else: return render_to_response('snippets/process.html', data, context_instance=build_context(request)) else: data['form'] = SnippetForm() # An unbound form return render_to_response('snippets/process.html', data, context_instance=build_context(request))
def edit(request): """ Update UserProfile """ if request.method == 'POST': form = ProfileForm(request.POST, instance=UserProfile.objects.get(user=request.user)) if form.is_valid(): # All validation rules pass try: User.objects.filter(email=form.cleaned_data['email']).\ exclude(pk=request.user.pk).get() request.session['flash'] = ['This e-mail is already in use', 'error'] return HttpResponseRedirect( request.META.get('HTTP_REFERER', '/')) except User.DoesNotExist:#Check if the e-mail is not already in use pass request.user.email = form.cleaned_data['email'] request.user.save() form.save() request.session['flash'] = ['Your profile has been updated', 'success'] return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) else: form = ProfileForm(instance=UserProfile.objects.get(user=request.user), initial = {'email': request.user.email}) return render_to_response('accounts/edit.html', {'form': form}, context_instance=build_context(request))
def read(request, pk): """Show a snippet with title, tags and render pygments body""" snippet = get_object_or_404(Snippet, pk=pk) if len(SnippetVersion.objects.filter(snippet=snippet).all()): versions = True else: versions = False comments_paginator = Paginator(SnippetComment.objects.filter( snippet=snippet).all(), 2) try: comments = comments_paginator.page(int(request.GET.get('page', 1))) except EmptyPage: comments = None snippet.highlight_body = snippet.highlight(snippet.body, get_lexer_by_name(snippet.lexer)) return render_to_response('snippets/read.html', { 'snippet': snippet, 'comments': comments, 'versions': versions, 'lines': range(1, snippet.body.count('\n')+2), }, context_instance=build_context(request))
def tag_view(request, tag): """ Show snippets of some tag """ snippets = Snippet.objects.filter(tags__name__in=[tag, ]).all() return render_to_response('tags/view.html', { 'tag': tag, 'snippets': snippets }, context_instance=build_context(request))
def search(request): """ Search using haystack """ data = {} query = data['query'] = request.GET.get('q', '') results = _search(query) paginator = Paginator(results, 25) data['results'] = paginator.page(int(request.GET.get('page', 1))) return render_to_response('snippets/search.html', data, context_instance=build_context(request))
def snippets_index(request): """ Used for the front page. Return latest 5 snippets""" snippets = Snippet.objects.all()[:5] if snippets == None: snippets = [] return render_to_response('pages/index.html', { 'snippets': snippets, 'home_page': True }, context_instance=build_context(request))
def following(request, username= None): """ Who is following username """ data = {} data['userdata'] = get_object_or_404(User, username=username) try: data['users'] = UserFollow.objects.select_related().filter(user=data['userdata']).all() except: data['users'] = None return render_to_response('accounts/following.html', data, context_instance=build_context(request))
def user(request, username=None): """Show user's profile""" if username == request.user.username: return HttpResponseRedirect('/accounts/profile') userdata = get_object_or_404(User, username=username) profile = UserProfile.objects.filter(user=userdata).get() if profile.profile_privacy == 'private': raise Http404 try: UserFollow.objects.filter(user=request.user, followed_user=userdata).get() is_following = True except: is_following = False if not user: raise Http404 tags = [] snippets = {} snippets_all = snippets = Snippet.objects.filter(author=userdata).filter(status='published').filter(privacy='public') paginator = Paginator(snippets, 25) try: page = int(request.GET.get('page', '1')) except: page = 1 snippets = paginator.page(page).object_list for snippet in snippets_all: try: tag_list = Tag.objects.get_for_object(snippet) for tag in tag_list: if tag not in tags: tags.append(tag) except: pass try: followed_users = UserFollow.objects.select_related().filter(user=userdata).all()[0:14] except: followed_users = None try: followers = UserFollow.objects.select_related().filter(followed_user=userdata).all()[0:14] except: followers = None return render_to_response( 'accounts/user.html', { 'userdata': userdata, 'profile': profile, 'tags': tags, 'snippets': snippets, 'followed_users': followed_users, 'followers': followers, 'is_following': is_following, 'sidebared': True, }, context_instance=build_context(request) )
def followers(request, username = None): """ Who are your followers Jesus? """ data = {} data['userdata'] = get_object_or_404(User, username=username) data['attribute'] = 'user' try: data['users'] = UserFollow.objects.select_related().filter(followed_user=data['userdata']).all() except: data['users'] = None return render_to_response('accounts/followers.html', data, context_instance=build_context(request))
def tag_user(request, tag, username): """ Display all `tag` snippets of `username` user """ user = get_object_or_404(User, username=username) snippets = Snippet.objects.filter(author=user).filter( tags__name__in=[tag, ]).all() return render_to_response('tags/view.html', { 'tag': tag, 'snippets': snippets }, context_instance=build_context(request))
def index(request, extra_context=None): """ This is the first page Need to return latest 10 snippets @todo: tag cloud """ snippets = Snippet.objects.all()[0:5] if snippets == None: snippets = [] return render_to_response( "pages/index.html", {"snippets": snippets, "home_page": True}, context_instance=build_context(request, extra_context=extra_context), )
def update(request, id=None): snippet = get_object_or_404(Snippet, pk=id) if request.user.id == snippet.author_id: if request.method == 'POST': # If the form has been submitted... form = SnippetForm(request.POST) # A form bound to the POST data if form.is_valid(): formData = form.save(commit = False) formData.pk = snippet.pk if 'delete' in request.POST: snippet.delete() request.session['flash'] = ['#' + str(formData.pk) +' deleted successfuly', 'sucess'] return HttpResponseRedirect('/accounts/profile/') if 'preview' in request.POST: data = {} data['title'] = formData.title; data['preview_body'] = highlight(formData.body, get_lexer_by_name(formData.lexer), HtmlFormatter(cssclass = 'source')) data['lines'] = range(1, formData.body.count('\n') + 2) data['form'] = form data['snippet'] = snippet return render_to_response('snippets/process.html', data, context_instance=build_context(request)) else: #save formData.author = request.user if not formData.lexer: try: lexer = guess_lexer(formData.body) for lex in LEXERS.itervalues(): if lexer.name == lex[1]: formData.lexer = lex[2][0].lower() except ClassNotFound: formData.lexer = 'text' formData.save() if snippet.body != formData.body: try: last_version = SnippetVersion.objects.order_by('-version').filter(snippet = snippet).all()[0] new_version = SnippetVersion(snippet = snippet, version = last_version.version + 1, body = snippet.body) new_version.save() except: create_version = SnippetVersion(snippet = snippet, version = 1, body = snippet.body) create_version.save() request.session['flash'] = ['#' + str(formData.pk) +' updated successfuly', 'sucess']; return HttpResponseRedirect('/accounts/profile/') # Redirect after POST else: return render_to_response('snippets/process.html', {'form': form }, context_instance=build_context(request)) else: form = SnippetForm(instance=snippet) return render_to_response('snippets/process.html', {'form': form, 'snippet': snippet }, context_instance=build_context(request)) else: request.session['flash'] = ['Access denied', 'error']; return HttpResponseRedirect('/accounts/profile/') # Redirect after POST
def profile(request): tags = [] snippets = {} snippets_all = snippets = Snippet.objects.filter(author=request.user) paginator = Paginator(snippets, 25) try: page = int(request.GET.get('page', '1')) except: page = 1 snippets = paginator.page(page).object_list for snippet in snippets_all: try: tag_list = Tag.objects.get_for_object(snippet) for tag in tag_list: if tag not in tags: tags.append(tag) except: pass try: profile_data = request.user.get_profile() except UserProfile.DoesNotExist: profile_data = None try: followed_users = UserFollow.objects.select_related().filter(user=request.user).all()[0:14] except: followed_users = None try: followers = UserFollow.objects.select_related().filter(followed_user=request.user).all()[0:14] except: followers = None return render_to_response( 'accounts/profile.html', { 'profile': profile_data, 'tags': tags, 'snippets': snippets, 'followed_users': followed_users, 'followers': followers, 'sidebared': True, }, context_instance=build_context(request) )
def read(request, id=None): snippet = get_object_or_404(Snippet, pk=id) if SnippetVersion.objects.filter(snippet = snippet).all(): versions = True else: versions = False comments_paginator = Paginator(SnippetComment.objects.filter(snippet=snippet).all(), 2) comments = comments_paginator.page(int(request.GET.get('page', 1))) snippet.highlight_body = snippet.highlight(snippet.body, get_lexer_by_name(snippet.lexer)) return render_to_response( 'snippets/read.html', { 'snippet': snippet, 'comments': comments, 'versions': versions, 'lines': range(1, snippet.body.count('\n')+2), }, context_instance=build_context(request) )
def edit(request): if request.method == 'POST': form = EditForm(request.POST) # A form bound to the POST data if form.is_valid(): # All validation rules pass request.user.email = form.cleaned_data['email'] request.user.save() profile = UserProfile.objects.get(user=request.user) profile.location = form.cleaned_data['location'] profile.url = form.cleaned_data['url'] profile.about = form.cleaned_data['about'] profile.user_follows_you = form.cleaned_data['user_follows_you'] profile.followed_user_created = form.cleaned_data['followed_user_created'] profile.user_commented = form.cleaned_data['user_commented'] #profile.user_shared = form.cleaned_data['user_shared'] #profile.my_snippet_changed = form.cleaned_data['my_snippet_changed'] profile.newsletter = form.cleaned_data['newsletter'] profile.profile_privacy = form.cleaned_data['profile_privacy'] profile.snippet_privacy = form.cleaned_data['snippet_privacy'] profile.save() request.session['flash'] = ['Your profile has been updated', 'success'] else: profile = UserProfile.objects.get(user=request.user) form = EditForm(initial = { 'email': request.user.email, 'location': profile.location, 'url': profile.url, 'about': profile.about, 'user_follows_you': profile.user_follows_you, 'followed_user_created': profile.followed_user_created, 'user_commented': profile.user_commented, #'user_shared': profile.user_shared, #'my_snippet_changed': profile.my_snippet_changed, 'newsletter': profile.newsletter, 'profile_privacy': profile.profile_privacy, 'snippet_privacy': profile.snippet_privacy, }) return render_to_response('accounts/edit.html', {'form': form, }, context_instance=build_context(request))
def index(request): """ My snippets """ snippets = Snippet.objects.filter(author=request.user) return render_to_response('snippets/index.html', {'snippets': snippets}, context_instance=build_context(request))
def search(request): data = {} data['query'] = request.GET.get('q', '') paginator = Paginator(Snippet.indexer.search(data['query']).prefetch(), 25) data['results'] = paginator.page(int(request.GET.get('page', 1))) return render_to_response('snippets/search.html', data, context_instance=build_context(request))
def process(request, pk=None): """ Create/Update snippet """ if pk is not None: #Update snippet = get_object_or_404(Snippet, pk=pk) form = SnippetUpdateForm(instance=snippet) if request.user != snippet.author and not request.user.is_staff: request.session['flash'] = ['Access denied', 'error'] return HttpResponseRedirect('/accounts/profile/') if 'delete' in request.POST: snippet.delete() request.session['flash'] = ['#%s deleted successfuly' % pk, 'sucess'] return HttpResponseRedirect('/accounts/profile/') else: #Create snippet = None form = SnippetCreateForm() if request.method == 'POST': if snippet is not None: form = SnippetUpdateForm(request.POST, instance=snippet) else: form = SnippetCreateForm(request.POST) if not form.is_valid(): # redirect to form with errors return render_to_response('snippets/process.html', { 'form': form }, context_instance=build_context(request)) formData = form.save(commit=False) if snippet is None: formData.author = request.user if not formData.lexer: try: lexer = guess_lexer(formData.body) for lex in LEXERS.itervalues(): if lexer.name == lex[1]: formData.lexer = lex[2][0].lower() except ClassNotFound: formData.lexer = 'text' formData.save() form.save_m2m() #Save tags if snippet is not None and snippet.body != formData.body: #The body has changed - create a new version try: last_version = SnippetVersion.objects.order_by('-version').\ filter(snippet=snippet).all()[0] version = SnippetVersion(snippet=snippet, version=last_version.version + 1, body=snippet.body) except: version = SnippetVersion(snippet=snippet, version=1, body=snippet.body) version.save() request.session['flash'] = ['#%s %s successfuly' % (formData.pk, 'update' if pk is not None else 'created'), 'sucess'] return HttpResponseRedirect('/accounts/profile/') else: return render_to_response('snippets/process.html', { 'form': form, 'snippet': snippet }, context_instance=build_context(request))
def user(request, tag = None, username = None): try: tag_object = Tag.objects.get(name=tag) snippets = TaggedItem.objects.get_by_model(Snippet, tag_object) except: snippets = None return render_to_response('tags/view.html', {'tag': tag, 'snippets': snippets}, context_instance=build_context(request))
def tags_index(request): """ View for all tags """ return render_to_response('tags/index.html', {'tags': Tag.objects.all()}, context_instance=build_context(request))
def view_profile(request, username=None): """ Display profile info, such as snippets, tags, and followed users """ #Set current user and check if it's my profile if username is None or username == request.user.username: user = request.user my_profile = True else: user = get_object_or_404(User, username=username) my_profile = False #If a user is created from the administration it may not have a profile try: user_profile = UserProfile.objects.filter(user=user).get() except UserProfile.DoesNotExist: raise Http404 #Check if the profile is private if user != request.user and user_profile.profile_privacy == 'private': raise Http404 #Check if the visiting user is following this user if request.user.is_anonymous(): is_following = False else: try: UserFollow.objects.filter(user=request.user).filter( followed_user=user).get() is_following = True except UserFollow.DoesNotExist: is_following = False snippets = Snippet.objects.filter(author=user) paginator = Paginator(snippets, 25) page = request.GET.get('page', '1') tags = [] for snippet in snippets.all(): for tag in snippet.tags.all(): if tag not in tags: tags.append(tag) followed_users = UserFollow.objects.select_related().filter( user=user).all()[:14] followers_list = UserFollow.objects.select_related().filter( followed_user=user).all()[:14] return render_to_response( 'accounts/profile.html', { 'userdata': user, 'profile': user_profile, 'tags': tags, 'snippets': paginator.page(page).object_list, 'followed_users': followed_users, 'followers': followers_list, 'is_following': is_following, 'sidebared': True, 'my_profile': my_profile, }, context_instance=build_context(request) )
def index(request): tags = Tag.objects.all() return render_to_response('tags/index.html', {}, context_instance=build_context(request))