def item(request, type, pk, slug, src=None): ''' @summary: Details of an item @src: Source of access. It may be used to manipulate the context/templates. eg. src='public_url' means this view is being accessed using some public url. ''' item_cls, template = _resolve_item_type(type) if item_cls is None: print "Error: content type is not found" raise Http404 # Get the object from the `pk`, raises a Http404 if not found obj = get_object_or_404(item_cls, pk=pk) # Check for permissions if type == 'poetry' or type == 'snippet': if user_has_group(request.user, ['Administrator', 'Editor']) is False: # Do not show unpublished `poetry`, `snippet` if obj.is_published() is False: raise PermissionDenied ## # Check, if `slug` is different from what it is expected, if slug != obj.get_slug(): if user_has_group(request.user, ['Administrator', 'Editor']): # softredirect to correct url return redirect(obj) else: # softredirect to the list page return HttpResponseRedirect(reverse('repository:list', kwargs={'type': type})) # Instantiate the Meta class meta = Meta(title = obj.title(), description = obj.meta_description(), section= type, url = obj.get_absolute_url(), author = obj.get_author(), date_time = obj.get_last_edit_time(), object_type = 'article', keywords = obj.get_keywords(), ) # Make the context and render context = {'obj': obj, 'meta': meta, 'item_type': type, 'src': src} return render(request, template, context)
def items(request): ''' @summary: Show all data items @note: Only 'Administrator' has access (redirect others to home page). ''' if user_has_group(request.user, ['Administrator',]) is False: # Redirect to home page return redirect('/') else: count = {} count['poetry'] = Poetry.objects.all().count count['snippet'] = Snippet.objects.all().count count['person'] = Person.objects.all().count count['place'] = Place.objects.all().count count['product'] = Product.objects.all().count count['event'] = Event.objects.all().count count['organization'] = Organization.objects.all().count count['book'] = Book.objects.all().count # Make the context and render context = {'obj': None, 'count': count } template = "repository/items/data.html" return render(request, template, context)
def items(request): ''' @summary: Show all data items @note: Only Administrator & Editor have access (redirect others to home page). ''' if user_has_group(request.user, ['Administrator', 'Editor']) is False: # Redirect to home page return redirect('/') else: count = {} count['poetry'] = Poetry.objects.all().count count['snippet'] = Snippet.objects.all().count count['person'] = Person.objects.all().count count['place'] = Place.objects.all().count count['product'] = Product.objects.all().count count['event'] = Event.objects.all().count count['organization'] = Organization.objects.all().count count['book'] = Book.objects.all().count # Make the context and render context = {'obj': None, 'count': count} template = "repository/items/data.html" return render(request, template, context)
def tagged_items(request, slug, item_type, src=None): """ @summary: Views the list of Items tagged using 'slug' TODO:: Order the list using some criteria @src: Source of access. It may be used to manipulate the context/templates. eg. src='public_url' means this view is being accessed using some public url. """ if item_type == Snippet.item_type(): item_cls = Snippet list_template = "repository/include/list/snippet.html" else: # Currently, tagging is supported only on Snippet & Poetry item_cls = Poetry list_template = "repository/include/list/poetry.html" try: if user_has_group(request.user, ['Administrator', 'Editor']): obj_list = item_cls.objects.filter(keywords__slug=slug) else: # Show only published `poetry`, `snippet` obj_list = item_cls.published.filter(keywords__slug=slug) except: print("Error: Unexpected error:", sys.exc_info()[0]) for frame in traceback.extract_tb(sys.exc_info()[2]): fname, lineno, fn, text = frame print("DBG:: Error in %s on line %d" % (fname, lineno)) obj_list = [] result_title = '#' + slug # Pagination paginator = Paginator(obj_list, 20) # Show 20 entries per page page = request.GET.get('page') try: objs = paginator.page(page) except PageNotAnInteger: # If page is not an integer, deliver first page. objs = paginator.page(1) except EmptyPage: # If page is out of range (e.g. 9999), deliver last page of results. objs = paginator.page(paginator.num_pages) context = { 'items': objs, 'tag': slug, 'list_template': list_template, 'item_type': item_type, 'result_title': result_title, 'src': src } template = 'repository/items/tagged-list.html' return render(request, template, context)
def tagged_items(request, slug, type, src=None): """ @summary: Views the list of Items tagged using 'slug' TODO:: Order the list using some criteria @src: Source of access. It may be used to manipulate the context/templates. eg. src='public_url' means this view is being accessed using some public url. """ if type == Snippet.item_type(): item_cls = Snippet list_template = "repository/include/list/snippet.html" else: # Currently, tagging is supported only on Snippet & Poetry item_cls = Poetry list_template = "repository/include/list/poetry.html" try: if user_has_group(request.user, ['Administrator', 'Editor']): obj_list = item_cls.objects.filter(keywords__slug=slug) else: # Show only published `poetry`, `snippet` obj_list = item_cls.published.filter(keywords__slug=slug) except: print ("Error: Unexpected error:", sys.exc_info()[0]) for frame in traceback.extract_tb(sys.exc_info()[2]): fname,lineno,fn,text = frame print ("DBG:: Error in %s on line %d" % (fname, lineno)) obj_list = [] result_title = '#' + slug # Pagination paginator = Paginator(obj_list, 20) # Show 20 entries per page page = request.GET.get('page') try: objs = paginator.page(page) except PageNotAnInteger: # If page is not an integer, deliver first page. objs = paginator.page(1) except EmptyPage: # If page is out of range (e.g. 9999), deliver last page of results. objs = paginator.page(paginator.num_pages) context = {'items': objs, 'tag': slug, 'list_template': list_template, 'item_type': type, 'result_title': result_title, 'src': src} template = 'repository/items/tagged-list.html' return render(request, template, context)
def home(request): ''' @summary: Show home page of Repository @note: Only 'Administrator' has access (redirect others to home page). ''' if user_has_group(request.user, ['Administrator',]) is False: # Redirect to home page return redirect('/') else: # Make the context and render context = {'obj': None } template = "repository/home.html" return render(request, template, context)
def home(request): ''' @summary: Show home page of Repository @note: Only Administrator & Editor have access (redirect others to home page). ''' if user_has_group(request.user, ['Administrator', 'Editor']) is False: # Redirect to home page return redirect('/') else: # Make the context and render context = {'obj': None} template = "repository/home.html" return render(request, template, context)
def list(request, type, src=None): ''' @summary: List the data item of `type` @src: Source of access. It may be used to manipulate the context/templates. eg. src='public_url' means this view is being accessed using some public url. ''' item_cls, list_template = _resolve_item_type(type, list=True) if item_cls is None: print "Error: content type is not found" raise Http404 q_objects = Q() ## # Check the parameters passed in the URL and process accordingly # Query tab q_tab = request.GET.get('tab', None) # Creator id (valid for items derived from `CreativeWork`) creator = request.GET.get('creator', None) # Language (valid for items derived from `CreativeWork`) language = request.GET.get('lan', None) # Sort the result by: 'name' for `Author.name`, 'edit' for `Author.date_modified` # Default is 'edit' i.e. Give recently edited item first sort = request.GET.get('sort', 'edit') # Order the result: # 'recent' for recently changed items first; # 'random' for random selection; # Default is 'recent' order = request.GET.get('o', 'recent') obj_list = [] result_title = item_cls._meta.verbose_name_plural.title() kwargs = {} query_tabs = [] extra_get_queries = [] # ## Process get queries if q_tab: if q_tab == 'all': pass elif q_tab == 'pub': kwargs['published'] = True elif q_tab == 'unpub': kwargs['published'] = False else: # Set the q_tab to None: ignore other values q_tab = None # Set order to its default i.e. `recent` if it is not the expected one. if order != 'shuffle': order = 'recent' q_string = '&o=' + order extra_get_queries.append(q_string) # Get the items having creator.id = creator if creator: try: q_string = '&creator=' + creator extra_get_queries.append(q_string) creator = int(creator) result_title = get_object_or_404(Person, pk=creator).full_name() kwargs['creator'] = creator except (TypeError, ValueError): print 'Error: That creator_id is not an integer, pass silently' pass if language: tmp = dict(LANGUAGES) if language in tmp: q_string = '&lan=' + language extra_get_queries.append(q_string) kwargs['language'] = language result_title += ', #' + tmp[language] # Only for ``poetry`` and ``snippet`` if type == 'poetry' or type == 'snippet': # Check for permissions if user_has_group(request.user, ['Administrator', 'Editor']): # Create ``query_tabs`` for user of Administrator and Editor groups query_tabs = _create_query_tabs(request.path, q_tab, extra_get_queries) else: # Create ``query_tabs`` for public users query_tabs = [] # Show only published `poetry`, `snippet` kwargs['published'] = True if order == 'shuffle': # Note: order_by('?') queries may be expensive and slow, # depending on the database backend you are using. # FIXME: It will slow down if table is large. Use some other options. obj_list = item_cls.objects.apply_filter(**kwargs).order_by('?') else: obj_list = item_cls.objects.apply_filter(**kwargs).order_by('-date_modified') # Pagination paginator = Paginator(obj_list, 20) # Show 20 entries per page page = request.GET.get('page') try: objs = paginator.page(page) except PageNotAnInteger: # If page is not an integer, deliver first page. objs = paginator.page(1) except EmptyPage: # If page is out of range (e.g. 9999), deliver last page of results. objs = paginator.page(paginator.num_pages) context = {'items': objs, 'list_template': list_template, 'item_type': type, 'result_title': result_title, 'query_tabs': query_tabs, 'order': order, 'src': src} template = 'repository/items/list.html' return render(request, template, context)
def _create_query_list(request, q=None, extra_get_queries=[]): ''' @summary: Return query list object for feedbacks ''' get_query = ''.join(extra_get_queries) url = request.path q_name = { 'all': 'All', 'pending': 'Pending', 'closed': 'Closed', 'me': 'My feedbacks', 'anonymous': 'Anonymous', 'known': 'By known' } # Create query list and populate query_list = [] item = { 'name': q_name['all'], 'help_text': 'Recent feedbacks', 'url': url + '?q=all', 'css': 'is-active' if q == 'all' else '', } query_list.append(item) item = { 'name': q_name['pending'], 'help_text': 'Feedbacks to which response is awaiting.', 'url': url + '?q=pending', 'css': 'is-active' if q == 'pending' else '', } query_list.append(item) item = { 'name': q_name['closed'], 'help_text': 'Feedbacks to which response has given.', 'url': url + '?q=closed', 'css': 'is-active' if q == 'closed' else '', } query_list.append(item) item = { 'name': q_name['me'], 'help_text': 'My feedbacks', 'url': url + '?q=me', 'css': 'is-active' if q == 'me' else '', } query_list.append(item) if user_has_group(request.user, ['Administrator',]): item = { 'name': q_name['anonymous'], 'help_text': 'Feedbacks by anonymous users', 'url': url + '?q=anonymous', 'css': 'is-active' if q == 'anonymous' else '', } query_list.append(item) item = { 'name': q_name['known'], 'help_text': 'User has account or have given email id', 'url': url + '?q=known', 'css': 'is-active' if q == 'known' else '', } query_list.append(item) return query_list, q_name[q]
def list(request, item_type, src=None): ''' @summary: List the data item of `item_type` @note: Only Administrator & Editor have access (redirect others to home page). ''' if user_has_group(request.user, ['Administrator', 'Editor']) is False: # Redirect to home page return redirect('/') item_cls, list_template = _resolve_item_type(item_type, list=True) if item_cls is None: print "Error: content item_type is not found" raise Http404 q_objects = Q() ## # Check the parameters passed in the URL and process accordingly # Query tab q_tab = request.GET.get('tab', None) # Creator id (valid for items derived from `CreativeWork`) creator = request.GET.get('creator', None) # Language (valid for items derived from `CreativeWork`) language = request.GET.get('lan', None) # Sort the result by: 'name' for `Author.name`, 'edit' for `Author.date_modified` # Default is 'edit' i.e. Give recently edited item first sort = request.GET.get('sort', 'edit') # Order the result: # 'recent' for recently changed items first; # 'random' for random selection; # Default is 'recent' order = request.GET.get('o', 'recent') obj_list = [] result_title = item_cls._meta.verbose_name_plural.title() kwargs = {} query_tabs = [] extra_get_queries = [] # ## Process get queries if q_tab: if q_tab == 'all': pass elif q_tab == 'pub': kwargs['published'] = True elif q_tab == 'unpub': kwargs['published'] = False else: # Set the q_tab to None: ignore other values q_tab = None # Set order to its default i.e. `recent` if it is not the expected one. if order != 'shuffle': order = 'recent' q_string = '&o=' + order extra_get_queries.append(q_string) # Get the items having creator.id = creator if creator: try: q_string = '&creator=' + creator extra_get_queries.append(q_string) creator = int(creator) result_title = get_object_or_404(Person, pk=creator).full_name() kwargs['creator'] = creator except (TypeError, ValueError): print 'Error: That creator_id is not an integer, pass silently' pass if language: tmp = dict(LANGUAGES) if language in tmp: q_string = '&lan=' + language extra_get_queries.append(q_string) kwargs['language'] = language result_title += ', #' + tmp[language] # Only for ``poetry`` and ``snippet`` if item_type == 'poetry' or item_type == 'snippet': # Check for permissions if user_has_group(request.user, ['Administrator', 'Editor']): # Create ``query_tabs`` for user of Administrator and Editor groups query_tabs = _create_query_tabs(request.path, q_tab, extra_get_queries) else: # Create ``query_tabs`` for public users query_tabs = [] # Show only published `poetry`, `snippet` kwargs['published'] = True if order == 'shuffle': # Note: order_by('?') queries may be expensive and slow, # depending on the database backend you are using. # FIXME: It will slow down if table is large. Use some other options. obj_list = item_cls.objects.apply_filter(**kwargs).order_by('?') else: if (q_tab == 'pub') and (item_type == 'poetry' or item_type == 'snippet'): obj_list = item_cls.objects.apply_filter( **kwargs).order_by('-date_published') else: obj_list = item_cls.objects.apply_filter( **kwargs).order_by('-date_modified') # Pagination paginator = Paginator(obj_list, 20) # Show 20 entries per page page = request.GET.get('page') try: objs = paginator.page(page) except PageNotAnInteger: # If page is not an integer, deliver first page. objs = paginator.page(1) except EmptyPage: # If page is out of range (e.g. 9999), deliver last page of results. objs = paginator.page(paginator.num_pages) context = { 'items': objs, 'list_template': list_template, 'item_type': item_type, 'result_title': result_title, 'query_tabs': query_tabs, 'order': order, 'src': src } template = 'repository/items/list.html' return render(request, template, context)
def item(request, item_type, pk, slug, src=None): ''' @summary: Details of an item @src: Source of access. It may be used to manipulate the context/templates. eg. src='public_url' means this view is being accessed using some public url. ''' item_cls, template = _resolve_item_type(item_type) if item_cls is None: print "Error: content item_type is not found" raise Http404 # Get the object from the `pk`, raises a Http404 if not found obj = get_object_or_404(item_cls, pk=pk) # Check for permissions if src != 'public_url': # public users should not have access to repository urls '/r/data/...' # redirect to respective public url if user_has_group(request.user, ['Administrator', 'Editor']) is False: if item_type == 'poetry' or item_type == 'snippet' or item_type == 'book': # There are different URLs for above three for public users # Redirect to those urls. # ADD THE NEW ITEM TYPE ABOVE if there are public url available for that ITEM TYPE. return HttpResponseRedirect(obj.get_absolute_url()) else: raise PermissionDenied if item_type == 'poetry' or item_type == 'snippet': if user_has_group(request.user, ['Administrator', 'Editor']) is False: # Do not show unpublished `poetry`, `snippet` if obj.is_published() is False: raise PermissionDenied # Check, if `slug` is different from what it is expected, if slug != obj.get_slug(): if user_has_group(request.user, ['Administrator', 'Editor']): # softredirect to correct url return redirect(obj) else: # softredirect to the item list page return HttpResponseRedirect(obj.get_list_url()) # Instantiate the Meta class if item_type == 'poetry': meta_image_url = obj.creator.get_image_url() elif item_type == 'person': meta_image_url = obj.get_image_url() else: meta_image_url = "img/poetrylearner_logo_120x120.png" meta = Meta( title=obj.title(), description=obj.meta_description(), section=item_type, url=obj.get_absolute_url(), author=obj.get_author(), date_time=obj.get_last_edit_time(), object_type='article', keywords=obj.get_keywords(), image=meta_image_url, ) # Make the context and render context = {'obj': obj, 'meta': meta, 'item_type': item_type, 'src': src} return render(request, template, context)
def feedback_list(request): ''' @summary: List all the feedbacks submitted till now by users ''' q_objects = Q() obj_list = [] ## # Check the parameters passed in the URL and process accordingly # Query tab q_tab = request.GET.get('tab', None) if q_tab == 'pending': # Feedbacks to which we have not responded obj_list = Feedback.objects.all().filter( Q(action__isnull=True) | Q(action=u'') ) elif q_tab == 'closed': # Feedbacks to which we have responded obj_list = Feedback.objects.all().exclude( Q(action__isnull=True) | Q(action=u'') ).order_by('-date_responded') elif q_tab == 'known': # User has account or have given email id obj_list = Feedback.objects.all().filter( Q(added_by__isnull=False) | Q(email__isnull=False) ).exclude(email=u'') elif q_tab == 'anonymous': # Feedbacks by anonymous users (haven't given email id) obj_list = Feedback.objects.all().filter( Q(added_by__isnull=True), Q(email__isnull=True) | Q(email=u'') ) elif q_tab == 'me': # Feedbacks by me i.e. request.user obj_list = Feedback.objects.all().filter( Q(added_by=request.user) ) elif q_tab == 'all': # Most recent feedbacks obj_list = Feedback.objects.all() else: # Default: Feedbacks to which we have not responded obj_list = Feedback.objects.all().filter( Q(action__isnull=True) | Q(action=u'') ) # Create tab list and populate query_tabs = [] tab = { 'name': 'all', 'help_text': 'Recent feedbacks', 'url': request.path + '?tab=all', 'css': 'is-active' if q_tab == 'all' else '', } query_tabs.append(tab) tab = { 'name': 'pending', 'help_text': 'Feedbacks to which response is awaiting.', 'url': request.path + '?tab=pending', 'css': 'is-active' if q_tab == 'pending' or q_tab is None else '', } query_tabs.append(tab) tab = { 'name': 'closed', 'help_text': 'Feedbacks to which response has given.', 'url': request.path + '?tab=closed', 'css': 'is-active' if q_tab == 'closed' else '', } query_tabs.append(tab) tab = { 'name': 'by me', 'help_text': 'My feedbacks', 'url': request.path + '?tab=me', 'css': 'is-active' if q_tab == 'me' else '', } query_tabs.append(tab) if user_has_group(request.user, ['Administrator',]): tab = { 'name': 'by anonymous', 'help_text': 'Feedbacks by anonymous users', 'url': request.path + '?tab=anonymous', 'css': 'is-active' if q_tab == 'anonymous' else '', } query_tabs.append(tab) tab = { 'name': 'by known', 'help_text': 'User has account or have given email id', 'url': request.path + '?tab=known', 'css': 'is-active' if q_tab == 'known' else '', } query_tabs.append(tab) # Pagination paginator = Paginator(obj_list, 20) # Show 20 entries per page page = request.GET.get('page') try: objs = paginator.page(page) except PageNotAnInteger: # If page is not an integer, deliver first page. objs = paginator.page(1) except EmptyPage: # If page is out of range (e.g. 9999), deliver last page of results. objs = paginator.page(paginator.num_pages) context = {'feedbacks': objs, 'query_tabs': query_tabs} template = 'feedback/list.html' return render(request, template, context)