diff --git a/doc/deployer/new_parser_instruction.txt b/doc/deployer/new_parser_instruction.txt new file mode 100644 index 0000000000..3f91c7e50f --- /dev/null +++ b/doc/deployer/new_parser_instruction.txt @@ -0,0 +1,7 @@ +1. Script which caches the full-site. +2. Basically a web-scraper that uses Beautiful Soup and Selenium for browser-automation. +3. Since many tags were stored as JS objects which were rendered only on a browser request, we needed to add Selenium. +4. Follows a DFS to save on memory. +5. Links are scraped off each web-page and the local links are set up in the stack. +6. Links previously visited and already in stack are left untouched. +7. Full-job will need some down-time, so preferable to run at startup only. diff --git a/doc/deployer/newparser.py b/doc/deployer/newparser.py new file mode 100644 index 0000000000..8581df74fb --- /dev/null +++ b/doc/deployer/newparser.py @@ -0,0 +1,51 @@ +#newparser +import logging +from selenium import webdriver +from selenium.webdriver.firefox.options import Options +from collections import deque +from bs4 import BeautifulSoup + +url="http://doer.metastudio.org" +stack=["/explore/courses"] +visited=[] +options=Options() +options.add_argument("--headless") +browser = webdriver.Firefox(firefox_options=options) + + +while(len(stack)>0 and len(visited)<100000): + str=stack.pop() + visited.append(str) + #print(str) + print(url+str) + print(len(visited)) + + try: + browser.get(url+str) + html=browser.page_source + except Exception as e: + logging.exception(e) + continue + + + if html is not None: + soup=BeautifulSoup(html,'html.parser') + else: + continue + + for link in soup.find_all('a'): + target = link.get('href') + print(target) + try: + if ((target not in visited) and (target not in stack) and type(target) == type("bat") and target[0] == '/'): + #print(target) + if (".gif" in target or ".jpg" in target or ".png" in target or "/accounts/login" in target): + continue + stack.append(target) + except: + pass + + + + + \ No newline at end of file diff --git a/doc/developer/GStudioLITE_README/Capture1.JPG b/doc/developer/GStudioLITE_README/Capture1.JPG new file mode 100644 index 0000000000..2c8e96f679 Binary files /dev/null and b/doc/developer/GStudioLITE_README/Capture1.JPG differ diff --git a/doc/developer/GStudioLITE_README/Capture2.JPG b/doc/developer/GStudioLITE_README/Capture2.JPG new file mode 100644 index 0000000000..50ceebd35c Binary files /dev/null and b/doc/developer/GStudioLITE_README/Capture2.JPG differ diff --git a/doc/developer/GStudioLITE_README/Capture3.JPG b/doc/developer/GStudioLITE_README/Capture3.JPG new file mode 100644 index 0000000000..e83cdc15ea Binary files /dev/null and b/doc/developer/GStudioLITE_README/Capture3.JPG differ diff --git a/doc/developer/GStudioLITE_README/Capture4.JPG b/doc/developer/GStudioLITE_README/Capture4.JPG new file mode 100644 index 0000000000..5d4385d8ca Binary files /dev/null and b/doc/developer/GStudioLITE_README/Capture4.JPG differ diff --git a/doc/developer/GStudioLITE_README/Capture5.JPG b/doc/developer/GStudioLITE_README/Capture5.JPG new file mode 100644 index 0000000000..2a392b50b3 Binary files /dev/null and b/doc/developer/GStudioLITE_README/Capture5.JPG differ diff --git a/doc/developer/GStudioLITE_README/GStudioLITE.md b/doc/developer/GStudioLITE_README/GStudioLITE.md new file mode 100644 index 0000000000..8bcd9e9f21 --- /dev/null +++ b/doc/developer/GStudioLITE_README/GStudioLITE.md @@ -0,0 +1,124 @@ +## GSTUDIO-LITE: OPTIMIZATION OF GSTUDIO USING BACKEND CACHING WITH REVALIDATION +The aim of the project was to use smart server side caching technologies to +improve the performance of GStudio instances from a client perspective, +while keeping the tradeoff between caching and dynamicity to a minimum. + + +We decided to go with filesystem based caching for our purposes. Memcached, although faster can't store a lot of resources. Filesystem based caching needs a path to be set where-in the cached resources are going to be stored. Since we are using the secondary memory we can cache in a lot of resources for a very long period of time. The sections below indicate how we configured Django into the filesystem caching mode. + +### DJANGO CACHING ARGUMENTS +![FileSystem Based Caching](Capture1.jpg). + +Each cache backend can be given additional arguments to control caching +behavior. These arguments are provided as additional keys in the CACHES +setting. Valid arguments are as follows: + +* **TIMEOUT**: The default timeout, in seconds, to use for the cache. +This argument defaults to 300 seconds (5 minutes). You can set +TIMEOUT to None so that, by default, cache keys never expire. A +value of 0 causes keys to immediately expire (effectively don't cache). +* **OPTIONS**: Any options that should be passed to the cache backend. +The list of valid options will vary with each backend, and cache +backends backed by a third-party library will pass their options +directly to the underlying cache library. +Cache backends that implement their own culling strategy (i.e., the +locmem, filesystem and database backends) will honor the following +options: + * **MAX ENTRIES**: The maximum number of entries allowed in +the cache before old values are deleted. This argument defaults +to 300. + * **CULL FREQUENCY**: The fraction of entries that are culled +when MAX ENTRIES is reached. The actual ratio is 1 / CULL FREQUENCY, so set CULL FREQUENCY to 2 to cull +half the entries when MAX ENTRIES is reached. This argument +should be an integer and defaults to 3. +A value of 0 for CULL FREQUENCY means that the entire +cache will be dumped when MAX ENTRIES is reached. On +some backends (database in particular) this makes culling much +faster at the expense of more cache misses. +Memcached backends pass the contents of OPTIONS as keyword +arguments to the client constructors, allowing for more advanced +control of client behavior. For example usage, see below. +* **KEY PREFIX**: A string that will be automatically included +(prepended by default) to all cache keys used by the Django server. +* **VERSION**: The default version number for cache keys generated by +the Django server. +* **KEY FUNCTION**: A string containing a dotted path to a function +that defines how to compose a prefix, version and key into a final +cache key. + +### MIDDLEWARE +![Middleware](Capture2.jpg). + +* **CACHE MIDDLEWARE ALIAS** : The cache alias to use for storage. +* **CACHE MIDDLEWARE SECONDS** : The number of seconds each page +should be cached. +* **CACHE MIDDLEWARE KEY PREFIX** : If the cache is shared across +multiple sites using the same Django installation, set this to the name of +the site, or some other string that is unique to this Django instance, to +prevent key collisions. Use an empty string if you dont care. +* **FetchFromCacheMiddleware** caches GET and HEAD responses with status +200, where the request and response headers allow. Responses to requests +for the same URL with different query parameters are considered to be +unique pages and are cached separately. This middleware expects that a +HEAD request is answered with the same response headers as the +corresponding GET request; in which case it can return a cached GET +response for HEAD request. +* Additionally, **UpdateCacheMiddleware** automatically sets a few headers in +each HttpResponse: + * Sets the Expires header to the current date/time plus the defined +**CACHE MIDDLEWARE SECONDS**. + * Sets the Cache-Control header to give a max age for the page again, +from the **CACHE MIDDLEWARE SECONDS** setting. +* If a view sets its own cache expiry time (i.e. it has a max-age section in its +Cache-Control header) then the page will be cached until the expiry time, +rather than **CACHE MIDDLEWARE SECONDS**. Using the decorators in +django.views.decorators.cache you can easily set a views expiry time (using +the cache control() decorator) or disable caching for a view (using the +never cache() decorator) + +### FULL-SITE CACHING +We were asked to develop a mechanism that would cache the entire site at user discretion. Hence we developed a crawler-script in Python that uses Beuatiful Soup and Selenium to crawl through all the pages on any web-site. As the requests are being made, the responses to them will be cached continuously in the Filesystem Backend. They will remain as such, until any update is made in any of the pages. In that case, a fresh response will be served and replace the stale response from the cache. + +### BEAUTIFUL SOUP LIBRARY +Beautiful Soup is a Python library for pulling data out of HTML and XML +files. It works with your favorite parser to provide idiomatic ways of +navigating, searching, and modifying the parse tree. It commonly saves +programmers hours or days of work. Beautiful Soup supports the HTML +parser included in Python's standard library, but it also supports a number +of third-party Python parsers. + +* To parse a document, pass it into the BeautifulSoup constructor: +**soup=BeautifulSoup(content,"html.parser")** +* **find_all()** method of the soup object helps us find something like all +the "a" tags, or anything more complicated than the first tag with a +certain name. +* We can use the **get()** method as follows: tag.get('attr'), in order to +get the value of the specified attribute in a particular tag. +* **prettify()** method of the soup object converts the response object into +a string. + +### SELENIUM +WebDriver in Selenium is a tool for automating web application testing, +and in particular to verify that they work as expected. WebDriver is the +name of the key interface against which tests should be written, but there +are several implementations. One such implementation is the Firefox +driver, which controls the Firefox browser using a Firefox plugin. + +* The **get** method in the WebDriver API is used to navigate to the webpage +whose URL is specified as an argument to the function. +* The **page_source** object in the WebDriver API is used to render the content +of the webpage opened by the WebDriver entirely as HTML. + +### CACHE REVALIDATION + +We set in place a HTTP cache revalidation mechanism, to revalidate our cache entries on each access so as to avoid sending old responses in case the pages in relevance have been updated since the cache was last updated. We used cache_control headers for that (refer the below section for documentation). cache_control headers ask the cache to revalidate it's entries by comparing timestamps of the cache entries and timestamps of records in the back-end Database. The following flowchart describes the mechanism. + +![Cache Revalidation](Capture5.jpg) + +### CACHE CONTROL DECORATOR +The following decorator in django.views.decorators.cache controls server +and client-side caching. + +![cache_control](Capture3.jpg) + +![patch_cache_control](Capture4.jpg). diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/Bib_App.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/Bib_App.py index 2e417b2320..1a2c3c4bf6 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/Bib_App.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/Bib_App.py @@ -7,7 +7,8 @@ from django_mongokit import get_database from django.contrib.auth.models import User from django.contrib.sites.models import Site - +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control try: from bson import ObjectId @@ -15,7 +16,7 @@ from pymongo.objectid import ObjectId from gnowsys_ndf.settings import GAPPS, MEDIA_ROOT -from gnowsys_ndf.ndf.models import GSystemType, Node +from gnowsys_ndf.ndf.models import GSystemType, Node from gnowsys_ndf.ndf.views.methods import get_node_common_fields from gnowsys_ndf.ndf.views.notify import set_notif_val from gnowsys_ndf.ndf.views.methods import * @@ -24,7 +25,7 @@ sitename=Site.objects.all() if sitename : sitename = sitename[0] -else : +else : sitename = "" db = get_database() @@ -61,10 +62,10 @@ dictionary={'techreport':["author","title","institution","year","type","number","address","month","note","key"]} Bibtex_entries.append(dictionary) dictionary={'unpublished':["author","title","note","month","year","key"]} -Bibtex_entries.append(dictionary) +Bibtex_entries.append(dictionary) ##Bib_App function - +@cache_control(must_revalidate=True, max_age=6) def Bib_App(request, group_id): """ Renders the main page of the app @@ -86,12 +87,12 @@ def Bib_App(request, group_id): variable = RequestContext(request,{'title': title, 'group_id': group_id, 'groupid': group_id}) return render_to_response(template,variable) - +@cache_control(must_revalidate=True, max_age=6) def view_entries(request, group_id,node_id=None): ''' renders the list view of all entries of a specific type when node_id is known ''' - + ins_objectid = ObjectId() if ins_objectid.is_valid(group_id) is False : group_ins = collection.Node.find_one({'_type': "Group","name": group_id}) @@ -104,7 +105,7 @@ def view_entries(request, group_id,node_id=None): group_id = str(auth._id) else : pass - + if node_id is None: num = int(request.GET.get('num')) entry=Bibtex_entries[num] @@ -124,7 +125,7 @@ def view_entries(request, group_id,node_id=None): return render_to_response(template,variable) - +@cache_control(must_revalidate=True, max_age=6) def view_entry(request,group_id,node_id): ''' renders list view of entries of a specific bibtex type when the type is known ''' @@ -147,6 +148,7 @@ def view_entry(request,group_id,node_id): variable = RequestContext(request, {'entry_inst': entry_inst, 'group_id': group_id, 'groupid': group_id,'title':title}) return render_to_response(template,variable) +@cache_control(must_revalidate=True, max_age=6) def view_sentry(request,group_id,node_id): ''' for displaying a specific entry ''' @@ -181,7 +183,7 @@ def view_sentry(request,group_id,node_id): print "before return" return render_to_response(template,variable) - +@cache_control(must_revalidate=True, max_age=6) def create_entries(request, group_id): ''' for creating a new bibtex entry_list ''' @@ -198,7 +200,7 @@ def create_entries(request, group_id): group_id = str(auth._id) else : pass - ''' for retreiving the fields of a particular bibtex entry + ''' for retreiving the fields of a particular bibtex entry ''' num = int(request.GET.get('num')) entry=Bibtex_entries[num] @@ -215,7 +217,7 @@ def create_entries(request, group_id): 'list_item':list_item, 'num':num } - entry_node = collection.GSystem() + entry_node = collection.GSystem() cite="" i=0 value="" @@ -249,7 +251,7 @@ def create_entries(request, group_id): get_node_common_fields(request,entry_node,group_id,GST_BIBTEX) entry_node.status=u'PUBLISHED' - + entry_node.save() ''' creating a GAttribute of AttributeType BibTex_entry for the already created GSystem @@ -280,14 +282,14 @@ def create_entries(request, group_id): entry_list.object_value=unicode(value) entry_list.save() return HttpResponseRedirect(reverse('view_entry', kwargs={'group_id': group_id, 'node_id': GST_BIBTEX._id})) - else: + else: return render_to_response("ndf/create_edit_entries.html", context_variables, context_instance=RequestContext(request)) - +@cache_control(must_revalidate=True, max_age=6) def delete_sentry(request, group_id, node_id): """Change the status to Hidden. """ @@ -312,11 +314,11 @@ def delete_sentry(request, group_id, node_id): gst_bibtex=(s[11:-3]) gst_bibtex=unicode(gst_bibtex, "UTF-8") op = collection.update({'_id': ObjectId(node_id)}, {'$set': {'status': u"HIDDEN"}}) - + return HttpResponseRedirect(reverse('view_entry', kwargs={'group_id': group_id,'node_id':gst_bibtex})) - +@cache_control(must_revalidate=True, max_age=6) def edit_entry(request,group_id,node_id): '''for editing entries ''' @@ -357,13 +359,13 @@ def edit_entry(request,group_id,node_id): values.append(each.split('$')[1]) except: u="not found" - content_org=GST_current.content_org + content_org=GST_current.content_org value="" Name=str(gst_entry.name) i=0 key="" value="" - list_item=tags + list_item=tags cite="" if request.method == "POST": name=request.POST.get("name") @@ -392,7 +394,7 @@ def edit_entry(request,group_id,node_id): cite += "page "+c+"," var +="}" - + GST_current.save() Bibtex=collection.Node.one({'name':'BibTex_entry','_type':'AttributeType'}) Bibtex_entry=collection.Node.one({'subject':GST_current._id,'attribute_type':Bibtex._id}) @@ -414,4 +416,3 @@ def edit_entry(request,group_id,node_id): variable=RequestContext(request,{'group_id':group_id,'groupid':group_id,'title':GST_current.name ,'tags':tags,'values':values,'zipped':zipped,'content_org':content_org}) template="ndf/edit_entry.html" return render_to_response(template,variable) - diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/Captcha.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/Captcha.py index 74623f43e8..5b862e5f9e 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/Captcha.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/Captcha.py @@ -4,11 +4,14 @@ from captcha.fields import CaptchaField from django.http import HttpResponse from django.http import StreamingHttpResponse +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control class CaptchaTestForm(forms.Form): - ''' class to instantiate CaptchaField() ''' + ''' class to instantiate CaptchaField() ''' captcha = CaptchaField() +@cache_control(must_revalidate=True, max_age=6) def captcha_validate(request): valid = "" data = request.POST.getlist('formData[]','') @@ -20,17 +23,15 @@ def captcha_validate(request): valid = False return HttpResponse(valid) +@cache_control(must_revalidate=True, max_age=6) def new_captcha(request): ''' method to return form''' - form = CaptchaTestForm() - return StreamingHttpResponse(str(form)) - + form = CaptchaTestForm() + return StreamingHttpResponse(str(form)) def convert_list_dict(data): - data_dict = {} + data_dict = {} for i in data: new_data = i.split(':') data_dict.update({new_data[0]:str(new_data[1])}) - return data_dict - - + return data_dict diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/adminDashboard.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/adminDashboard.py index 9a088926ad..dd1c17f5a1 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/adminDashboard.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/adminDashboard.py @@ -11,9 +11,12 @@ import json +from django.views.decorators.cache import cache_control + GAPP = node_collection.one({'$and':[{'_type':'MetaType'},{'name':'GAPP'}]}) # fetching MetaType name GAPP @user_passes_test(lambda u: u.is_superuser) +@cache_control(must_revalidate=True, max_age=6) def adminDashboard(request): ''' methods for class view @@ -33,6 +36,7 @@ def adminDashboard(request): return render_to_response(template, variable) @user_passes_test(lambda u: u.is_superuser) +@cache_control(must_revalidate=True, max_age=6) def adminDashboardClass(request, class_name="GSystem"): ''' fetching class's objects @@ -122,6 +126,7 @@ def adminDashboardClass(request, class_name="GSystem"): @user_passes_test(lambda u: u.is_superuser) +@cache_control(must_revalidate=True, max_age=6) def adminDashboardEdit(request): ''' edit class's objects @@ -174,6 +179,7 @@ def adminDashboardEdit(request): return StreamingHttpResponse(e) @user_passes_test(lambda u: u.is_superuser) +@cache_control(must_revalidate=True, max_age=6) def adminDashboardDelete(request): ''' delete class's objects diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/adminDesignerDashboard.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/adminDesignerDashboard.py index 50a36e59cf..7ca7b695e0 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/adminDesignerDashboard.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/adminDesignerDashboard.py @@ -13,7 +13,10 @@ import json import datetime +from django.views.decorators.cache import cache_control + @user_passes_test(lambda u: u.is_superuser) +@cache_control(must_revalidate=True, max_age=6) def adminDesignerDashboardClass(request, class_name='GSystemType'): ''' fetching class's objects @@ -108,6 +111,7 @@ def adminDesignerDashboardClass(request, class_name='GSystemType'): @user_passes_test(lambda u: u.is_superuser) +@cache_control(must_revalidate=True, max_age=6) def adminDesignerDashboardClassCreate(request, class_name='GSystemType', node_id=None): ''' delete class's objects @@ -358,4 +362,6 @@ def adminDesignerDashboardClassCreate(request, class_name='GSystemType', node_id variable = RequestContext(request, {'class_name':class_name, "url":"designer", "class_structure":class_structure, 'definitionlist':definitionlist, 'contentlist':contentlist, 'dependencylist':dependencylist, 'options':options, "required_fields":required_fields,"groupid":groupid,"translate":translate,"lan":LANGUAGES,'group_id':groupid, 'help_tip':help_tip }) - return render_to_response(template, variable) \ No newline at end of file + return render_to_response(template, variable) + + diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/ajax_views.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/ajax_views.py index 34f804e4a3..66c20e4ca5 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/ajax_views.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/ajax_views.py @@ -50,7 +50,7 @@ # from gnowsys_ndf.mobwrite.models import ViewObj from gnowsys_ndf.notification import models as notification from gnowsys_ndf.ndf.views.asset import * -from gnowsys_ndf.ndf.views.trash import * +from gnowsys_ndf.ndf.views.trash import * theme_GST = node_collection.one({'_type': 'GSystemType', 'name': 'Theme'}) topic_GST = node_collection.one({'_type': 'GSystemType', 'name': 'Topic'}) @@ -60,6 +60,8 @@ # This function is used to check (while creating a new group) group exists or not # This is called in the lost focus event of the group_name text box, to check the existance of group, in order to avoid duplication of group names. +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control @get_execution_time class Encoder(json.JSONEncoder): @@ -69,7 +71,7 @@ def default(self, obj): else: return obj - +@cache_control(must_revalidate=True, max_age=6) def get_node_json_from_id(request, group_id, node_id=None): if not node_id: node_id = request.GET.get('node_id') @@ -87,7 +89,7 @@ def get_node_json_from_id(request, group_id, node_id=None): else: return HttpResponse(0) - +@cache_control(must_revalidate=True, max_age=6) def save_node(request, group_id, node_id=None): try: group_id = ObjectId(group_id) @@ -119,6 +121,7 @@ def save_node(request, group_id, node_id=None): @login_required +@cache_control(must_revalidate=True, max_age=6) def remove_from_nodelist(request, group_id): parent_node_id = request.POST.get('parent_node_id', None) child_node_id = request.POST.get('child_node_id', None) @@ -138,6 +141,7 @@ def remove_from_nodelist(request, group_id): @login_required +@cache_control(must_revalidate=True, max_age=6) def ajax_delete_node(request, group_id): node_to_delete = request.POST.get('node_to_delete', None) deletion_type = eval(request.POST.get('deletion_type', 0)) @@ -158,6 +162,7 @@ def checkgroup(request, group_name): return HttpResponse("failure") @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def terms_list(request, group_id): if request.is_ajax() and request.method == "POST": # page number which have clicked on pagination @@ -190,6 +195,7 @@ def terms_list(request, group_id): # This ajax view creates the page collection of selected nodes from list view @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def collection_create(request, group_id): ''' This ajax view creates the page collection of selected nodes from list view @@ -239,6 +245,7 @@ def collection_create(request, group_id): # This ajax view renders the output as "node view" by clicking on collections @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def collection_nav(request, group_id): ''' This ajax function retunrs the node on main template, when clicked on collection hierarchy @@ -345,6 +352,7 @@ def collection_nav(request, group_id): # This view handles the collection list of resource and its breadcrumbs @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def collection_view(request, group_id): ''' This ajax function returns breadcrumbs_list for clicked node in collection hierarchy @@ -381,6 +389,7 @@ def collection_view(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def shelf(request, group_id): if request.is_ajax() and request.method == "POST": shelf = request.POST.get("shelf_name", '') @@ -468,6 +477,7 @@ def shelf(request, group_id): ) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def drawer_widget(request, group_id): drawer = None drawers = None @@ -558,6 +568,7 @@ def drawer_widget(request, group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def select_drawer(request, group_id): if request.is_ajax() and request.method == "POST": drawer = None @@ -676,6 +687,7 @@ def select_drawer(request, group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def search_drawer(request, group_id): if request.is_ajax() and request.method == "POST": @@ -783,6 +795,7 @@ def search_drawer(request, group_id): ) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_topic_contents(request, group_id): # if request.is_ajax() and request.method == "POST": node_id = request.GET.get("node_id", '') @@ -831,6 +844,7 @@ def get_collection_list(collection_list, node): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_tree_hierarchy(request, group_id, node_id): Collapsible = request.GET.get("collapsible", "") @@ -945,6 +959,7 @@ def get_inner_collection(collection_list, node, no_res=False): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_collection(request, group_id, node_id, no_res=False): try: # cache_key = u'get_collection' + unicode(group_id) + "_" + unicode(node_id) @@ -962,7 +977,7 @@ def get_collection(request, group_id, node_id, no_res=False): if obj: node_type = node_collection.one({'_id': ObjectId(obj.member_of[0])}).name # print "000000000000000000000",node.name - + collection_list.append({'name':obj.name,'id':obj.pk,'node_type':node_type,'type' : "branch"}) # collection_list = get_inner_collection(collection_list, obj, gstaff_access, completed_ids_list, incompleted_ids_list) if "BaseCourseGroup" in node.member_of_names_list: @@ -979,6 +994,7 @@ def get_collection(request, group_id, node_id, no_res=False): print ee @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def add_sub_themes(request, group_id): if request.is_ajax() and request.method == "POST": @@ -1011,11 +1027,12 @@ def add_sub_themes(request, group_id): return HttpResponse("None") @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def add_theme_item(request, group_id): if request.is_ajax() and request.method == "POST": existing_id = request.POST.get("existing_id", '') - + context_theme_id = request.POST.get("context_theme", '') name =request.POST.get('name','') parent_node_id =request.POST.get('parent_id','') @@ -1053,6 +1070,7 @@ def add_theme_item(request, group_id): return HttpResponse("success") @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def add_topics(request, group_id): if request.is_ajax() and request.method == "POST": # print "\n Inside add_topics ajax view\n" @@ -1085,6 +1103,7 @@ def add_topics(request, group_id): return HttpResponse("None") @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def add_page(request, group_id): is_create_note = request.POST.get("is_create_note", '') tags = request.POST.get("tags", '') @@ -1150,6 +1169,7 @@ def add_page(request, group_id): return HttpResponse(json.dumps(response_dict)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def add_file(request, group_id): # this is context node getting from the url get request context_node_id = request.GET.get('context_node', '') @@ -1215,7 +1235,6 @@ def add_file(request, group_id): return HttpResponseRedirect(url_name) - def collection_of_node(node=None, group_id=None): theme_item_GST = node_collection.one({'_type': 'GSystemType', 'name': 'theme_item'}) @@ -1312,6 +1331,7 @@ def theme_node_collection(node=None, group_id=None): return True @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def delete_themes(request, group_id): '''delete themes objects''' send_dict = [] @@ -1358,6 +1378,7 @@ def delete_themes(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def change_group_settings(request,group_id): ''' changing group's object data @@ -1412,6 +1433,7 @@ def get_module_set_list(node): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def make_module_set(request, group_id): ''' This methode will create module of collection and stores objectid's with version number's @@ -1567,6 +1589,7 @@ def walk(node): return list @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_module_json(request, group_id): _id = request.GET.get("_id", "") node = node_collection.one({'_id': ObjectId(_id)}) @@ -1576,6 +1599,7 @@ def get_module_json(request, group_id): # ------------- For generating graph json data ------------ @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def graph_nodes(request, group_id): page_node = node_collection.one({'_id': ObjectId(request.GET.get("id"))}) page_node.get_neighbourhood(page_node.member_of) @@ -1746,6 +1770,7 @@ def _get_node_info(node_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_data_for_switch_groups(request,group_id): coll_obj_list = [] node_id = request.GET.get("object_id", "") @@ -1758,6 +1783,7 @@ def get_data_for_switch_groups(request,group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_data_for_drawer(request, group_id): ''' designer module's drawer widget function @@ -1774,6 +1800,7 @@ def get_data_for_drawer(request, group_id): # This method is not in use @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_data_for_user_drawer(request, group_id,): # This method will return data for user widget d1 = [] @@ -1850,6 +1877,7 @@ def set_drawer_widget_for_users(st, coll_obj_list): return data_list @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_data_for_batch_drawer(request, group_id): ''' This method will return data for batch drawer widget @@ -1942,6 +1970,7 @@ def set_drawer_widget(st, coll_obj_list, extra_key=None): return data_list @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_data_for_event_task(request, group_id): #date creation for task type is date month and year day_list=[] @@ -2094,6 +2123,7 @@ def get_data_for_event_task(request, group_id): return HttpResponse(json.dumps(day_list,cls=NodeJSONEncoder)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_data_for_drawer_of_attributetype_set(request, group_id): ''' this method will fetch data for designer module's drawer widget @@ -2128,6 +2158,7 @@ def get_data_for_drawer_of_attributetype_set(request, group_id): return HttpResponse(json.dumps(data_list)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_data_for_drawer_of_relationtype_set(request, group_id): ''' this method will fetch data for designer module's drawer widget @@ -2164,6 +2195,7 @@ def get_data_for_drawer_of_relationtype_set(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def deletion_instances(request, group_id): """ Deletes the given node(s) and associated GAttribute(s) & GRelation(s) @@ -2279,6 +2311,7 @@ def deletion_instances(request, group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_visited_location(request, group_id): usrid = request.user.id visited_location = "" @@ -2326,6 +2359,7 @@ def get_online_editing_user(request, group_id): ''' @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def view_articles(request, group_id): if request.is_ajax(): # extracting all the bibtex entries from database @@ -2353,6 +2387,7 @@ def view_articles(request, group_id): return StreamingHttpResponse(json.dumps(response_dict)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_author_set_users(request, group_id): ''' This ajax function will give all users present in node's author_set field @@ -2390,6 +2425,7 @@ def get_author_set_users(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def remove_user_from_author_set(request, group_id): ''' This ajax function remove the user from athor_set @@ -2418,6 +2454,7 @@ def remove_user_from_author_set(request, group_id): return StreamingHttpResponse("Invalid Ajax call") @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_filterd_user_list(request, group_id): ''' This function will return (all user's) - (subscribed user for perticular group) @@ -2435,6 +2472,7 @@ def get_filterd_user_list(request, group_id): return HttpResponse(json.dumps(filtered_users)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def search_tasks(request, group_id): ''' This function will return (all task's) @@ -2456,6 +2494,7 @@ def search_tasks(request, group_id): raise Http404 @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_group_member_user(request, group_id): """Returns member(s) of the group excluding (group-admin(s)) in form of dictionary that consists of key-value pair: @@ -2475,6 +2514,7 @@ def get_group_member_user(request, group_id): raise Http404 @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def annotationlibInSelText(request, group_id): """ This view parses the annotations field of the currently selected node_id and evaluates if entry corresponding this selectedText already exists. @@ -2527,6 +2567,7 @@ def annotationlibInSelText(request, group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def delComment(request, group_id): ''' Delete comment from thread @@ -2538,6 +2579,7 @@ def delComment(request, group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_students(request, group_id): """ This view returns list of students along with required data based on selection criteria @@ -2836,6 +2878,7 @@ def get_students(request, group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_statewise_data(request, group_id): """ This view returns a download link of CSV created consisting of students statistical data based on degree_year for each college. @@ -2971,6 +3014,7 @@ def get_statewise_data(request, group_id): return HttpResponse(json.dumps(response_dict)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_college_wise_students_data(request, group_id): """ This view returns a download link of CSV created consisting of students statistical data based on degree_year for each college. @@ -3115,6 +3159,7 @@ def get_college_wise_students_data(request, group_id): return HttpResponse(json.dumps(response_dict)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def set_user_link(request, group_id): """ This view creates a relationship (has_login) between the given node (node_id) and the author node (username); @@ -3196,6 +3241,7 @@ def set_user_link(request, group_id): return HttpResponse(json.dumps({'result': result, 'message': error_message})) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def set_enrollment_code(request, group_id): """ """ @@ -3207,6 +3253,7 @@ def set_enrollment_code(request, group_id): raise Exception(error_message) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_students_assignments(request, group_id): """ Arguments: @@ -3329,6 +3376,7 @@ def get_students_assignments(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_districts(request, group_id): """ This view fetches district(s) belonging to given state. @@ -3386,6 +3434,7 @@ def get_districts(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_affiliated_colleges(request, group_id): """ This view returns list of colleges affiliated to given university. @@ -3460,6 +3509,7 @@ def get_affiliated_colleges(request, group_id): return HttpResponse(json.dumps(response_dict)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_courses(request, group_id): """ This view returns list of NUSSD-Course(s) belonging to given course type. @@ -3556,6 +3606,7 @@ def get_courses(request, group_id): return HttpResponse(json.dumps(response_dict)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_announced_courses_with_ctype(request, group_id): """ This view returns list of announced-course(s) that match given criteria @@ -3852,6 +3903,7 @@ def get_announced_courses_with_ctype(request, group_id): return HttpResponse(json.dumps({'message': error_message})) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_colleges(request, group_id, app_id): """This view returns HttpResponse with following data: - List of college(s) affiliated to given university where @@ -4026,6 +4078,7 @@ def get_colleges(request, group_id, app_id): return HttpResponse(json.dumps(response_dict)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_anncourses_allstudents(request, group_id): """ This view returns ... @@ -4222,6 +4275,7 @@ def get_anncourses_allstudents(request, group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_course_details_for_trainer(request, group_id): """ This view returns a dictionary holding data required for trainer's enrollment @@ -4378,6 +4432,7 @@ def get_course_details_for_trainer(request, group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_students_for_approval(request, group_id): """This returns data-review list of students that need approval for Course enrollment. """ @@ -4514,6 +4569,7 @@ def get_students_for_approval(request, group_id): return HttpResponse(json.dumps(response_dict)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def approve_students(request, group_id): """This returns approved and/or rejected students count respectively. """ @@ -4857,6 +4913,7 @@ def worker(student_cur, course_ids, course_enrollment_status_text, course_enroll @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_students_for_batches(request, group_id): """ This view returns ... @@ -4928,6 +4985,7 @@ def get_students_for_batches(request, group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def edit_task_title(request, group_id): ''' This function will edit task's title @@ -4943,6 +5001,7 @@ def edit_task_title(request, group_id): raise Http404 @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def edit_task_content(request, group_id): ''' This function will edit task's title @@ -4963,6 +5022,7 @@ def edit_task_content(request, group_id): raise Http404 @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def insert_picture(request, group_id): if request.is_ajax(): resource_list=node_collection.find( @@ -4988,6 +5048,7 @@ def insert_picture(request, group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def close_event(request, group_id, node): #close_event checks if the event start date is greater than or less than current date time #if current date time if greater than event time than it changes tha edit button @@ -4999,6 +5060,7 @@ def close_event(request, group_id, node): return HttpResponse("event closed") @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def save_time(request, group_id, node): start_time = request.POST.get('start_time','') end_time = request.POST.get('end_time','') @@ -5031,6 +5093,7 @@ def save_time(request, group_id, node): return HttpResponse("Session rescheduled") @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def check_date(request, group_id, node): reschedule = request.POST.get('reschedule','') @@ -5060,6 +5123,7 @@ def check_date(request, group_id, node): return HttpResponse(message) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def reschedule_task(request, group_id, node): task_dict={} @@ -5200,6 +5264,7 @@ def reschedule_task(request, group_id, node): return HttpResponse(return_message) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def event_assginee(request, group_id, app_set_instance_id=None): Event= request.POST.getlist("Event","") @@ -5293,6 +5358,7 @@ def event_assginee(request, group_id, app_set_instance_id=None): return HttpResponse("Details Entered") @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def fetch_course_name(request, group_id,Course_type): courses=node_collection.find({"attribute_set.nussd_course_type":unicode(Course_type)}) @@ -5306,6 +5372,7 @@ def fetch_course_name(request, group_id,Course_type): return HttpResponse(json.dumps(course_list)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def fetch_course_Module(request, group_id,announced_course): #Course_name batch = request.GET.get('batchid','') @@ -5362,6 +5429,7 @@ def fetch_course_Module(request, group_id,announced_course): return HttpResponse(json.dumps(superdict)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def fetch_batch_student(request, group_id,Course_name): try: courses=node_collection.one({"_id":ObjectId(Course_name)},{'relation_set.has_batch_member':1}) @@ -5379,6 +5447,7 @@ def fetch_batch_student(request, group_id,Course_name): return HttpResponse(json.dumps(list1)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def fetch_course_session(request, group_id,Course_name): try: courses=node_collection.one({"_id":ObjectId(Course_name)}) @@ -5415,6 +5484,7 @@ def fetch_course_session(request, group_id,Course_name): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def fetch_course_batches(request, group_id,Course_name): #courses=node_collection.one({"_id":ObjectId(Course_name)}) #courses=node_collection.find({"relation_set.announced_for":ObjectId(Course_name)}) @@ -5435,6 +5505,7 @@ def fetch_course_batches(request, group_id,Course_name): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def save_csv(request,group_id,app_set_instance_id=None): #column_header = [u'Name', 'Presence','Attendance_marks','Assessment_marks'] json_data=request.POST.getlist("attendance[]","") @@ -5455,6 +5526,7 @@ def save_csv(request,group_id,app_set_instance_id=None): fw.writerow(ast.literal_eval(row)) return HttpResponse((STATIC_URL + filename)) +@cache_control(must_revalidate=True, max_age=6) def get_assessment(request,group_id,app_set_instance_id): node = node_collection.one({'_type': "GSystem", '_id': ObjectId(app_set_instance_id)}) node.get_neighbourhood(node.member_of) @@ -5481,6 +5553,7 @@ def get_assessment(request,group_id,app_set_instance_id): return HttpResponse(json.dumps(marks_list)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_attendees(request,group_id,node): #get all the ObjectId of the people who would attend the event node=node_collection.one({'_id':ObjectId(node)}) @@ -5518,6 +5591,7 @@ def get_attendees(request,group_id,node): return HttpResponse(json.dumps(a)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_attendance(request,group_id,node): #method is written to get the presence and absence of attendees for the event node=node_collection.one({'_id':ObjectId(node)}) @@ -5621,6 +5695,7 @@ def get_attendance(request,group_id,node): return HttpResponse(json.dumps(attendance)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def attendees_relations(request,group_id,node): test_output = node_collection.find({"_id":ObjectId(node),"attribute_set.start_time":{'$lt':datetime.datetime.today()}}) if test_output.count() != 0: @@ -5686,6 +5761,7 @@ def attendees_relations(request,group_id,node): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def page_scroll(request,group_id,page): hyperlinks = request.GET.get("links") if hyperlinks: @@ -5736,6 +5812,7 @@ def page_scroll(request,group_id,page): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_batches_with_acourse(request, group_id): """ This view returns list of batches that match given criteria @@ -5781,6 +5858,7 @@ def get_batches_with_acourse(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_universities(request, group_id): """ This view fetches Universities belonging to given state. @@ -5846,6 +5924,7 @@ def get_universities(request, group_id): # MIS Reports @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_detailed_report(request, group_id): """ This view returns list of students along with required data based on selection criteria @@ -6208,7 +6287,7 @@ def get_detailed_report(request, group_id): response_dict["message"] = error_message return HttpResponse(json.dumps(response_dict, cls=NodeJSONEncoder)) - +@cache_control(must_revalidate=True, max_age=6) def get_resource_by_oid(request, group_id): oid = request.GET.get('oid', None) @@ -6226,7 +6305,7 @@ def get_resource_by_oid(request, group_id): return HttpResponse('false') - +@cache_control(must_revalidate=True, max_age=6) def get_resource_by_oid_list(request, group_id): oid_list = request.GET.get('oid_list', None) @@ -6256,7 +6335,7 @@ def get_resource_by_oid_list(request, group_id): return HttpResponse('false') - +@cache_control(must_revalidate=True, max_age=6) def show_coll_cards(request, group_id): node_id = request.GET.get('node_id') @@ -6274,7 +6353,7 @@ def show_coll_cards(request, group_id): - +@cache_control(must_revalidate=True, max_age=6) def get_visits_count(request, group_id): ''' Accepts: @@ -6344,6 +6423,7 @@ def get_visits_count(request, group_id): return HttpResponse(json.dumps(response_dict)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_ckeditor(request,group_id): ckeditor_toolbar_val = request.GET.get('ckeditor_toolbar') return render_to_response('ndf/html_editor.html', @@ -6354,6 +6434,7 @@ def get_ckeditor(request,group_id): context_instance=RequestContext(request)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_gin_line_template(request,group_id,node_id): node_obj = node_collection.one({'_id': ObjectId(node_id)}) global_disc_all_replies = [] @@ -6373,6 +6454,7 @@ def get_gin_line_template(request,group_id,node_id): context_instance=RequestContext(request)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def course_create_collection(request, group_id): is_create_collection = request.GET.get('is_create_collection','') is_add_to_collection = request.GET.get('is_add_to_collection','') @@ -6404,6 +6486,7 @@ def course_create_collection(request, group_id): },context_instance=RequestContext(request)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def course_create_note(request, group_id): img_list = request.GET.get('img_list','') audio_list = request.GET.get('audio_list','') @@ -6420,6 +6503,7 @@ def course_create_note(request, group_id): },context_instance=RequestContext(request)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def adminRenderGraph(request,group_id,node_id=None,graph_type="concept"): ''' Renders the Concept Graph, Collection Graph, Dependency Graph @@ -6436,6 +6520,7 @@ def adminRenderGraph(request,group_id,node_id=None,graph_type="concept"): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def upload_file_ckeditor(request,group_id): try: group_id = ObjectId(group_id) @@ -6493,6 +6578,7 @@ def upload_file_ckeditor(request,group_id): # return HttpResponseRedirect( reverse('file_detail', kwargs={"group_id": group_id,'_id':gs_obj_id}) ) @login_required +@cache_control(must_revalidate=True, max_age=6) def search_users(request, group_id): if request.is_ajax() and request.method == "GET": from bson import json_util @@ -6519,6 +6605,7 @@ def search_users(request, group_id): @login_required +@cache_control(must_revalidate=True, max_age=6) def save_user_password(request, group_id): response_dict = {'success': False} if request.is_ajax() and request.method == "POST": @@ -6533,6 +6620,7 @@ def save_user_password(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def upload_video_thumbnail(request,group_id): try: group_id = ObjectId(group_id) @@ -6563,6 +6651,7 @@ def upload_video_thumbnail(request,group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_paged_images(request, group_id): is_create_collection = request.GET.get('is_create_collection','') is_add_to_collection = request.GET.get('is_add_to_collection','') @@ -6589,6 +6678,7 @@ def get_paged_images(request, group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_templates_page(request, group_id): try: group_id = ObjectId(group_id) @@ -6605,6 +6695,7 @@ def get_templates_page(request, group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_group_templates_page(request, group_id): # try: # group_id = ObjectId(group_id) @@ -6643,6 +6734,7 @@ def get_group_pages(request, group_id): ''' @login_required +@cache_control(must_revalidate=True, max_age=6) def get_group_resources(request, group_id, res_type="Page"): except_collection_set = [] res_cur = None @@ -6677,6 +6769,7 @@ def get_group_resources(request, group_id, res_type="Page"): variable = RequestContext(request, {'cursor': res_cur, 'groupid': group_id, 'group_id': group_id, 'card_class': card_class }) return render_to_response(template, variable) +@cache_control(must_revalidate=True, max_age=6) def get_info_pages(request, group_id): node_id = request.POST.get("node_id", '') page_type = request.POST.get("page_type", '') @@ -6687,6 +6780,7 @@ def get_info_pages(request, group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def add_transcript(request, group_id): try: group_id = ObjectId(group_id) @@ -6703,6 +6797,7 @@ def add_transcript(request, group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_video_player(request, group_id): try: group_id = ObjectId(group_id) @@ -6718,6 +6813,7 @@ def get_video_player(request, group_id): context_instance=RequestContext(request)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_audio_player(request, group_id): try: group_id = ObjectId(group_id) @@ -6735,6 +6831,7 @@ def get_audio_player(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_jhapps(request,group_id): try: group_id = ObjectId(group_id) @@ -6753,6 +6850,7 @@ def get_jhapps(request,group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def add_asset(request,group_id): try: group_id = ObjectId(group_id) @@ -6774,8 +6872,9 @@ def add_asset(request,group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def create_edit_asset(request,group_id): - + try: group_id = ObjectId(group_id) except: @@ -6783,7 +6882,7 @@ def create_edit_asset(request,group_id): group_obj = Group.get_group_name_id(group_id, get_obj=True) selected_topic = request.POST.get("topic_list", '') # selected_topic_list = request.POST.getlist("coll_arr[]", '') - + if request.method == "POST": asset_name = str(request.POST.get("asset_name", '')).strip() asset_disp_name = str(request.POST.get("asset_disp_name", '')).strip() @@ -6795,9 +6894,9 @@ def create_edit_asset(request,group_id): tags = json.loads(tags) else: tags = [] - + asset_lang = request.POST.get("sel_asset_lang", '') - + is_raw_material = eval(request.POST.get('is_raw_material', "False")) # print "\nis_raw_material: ", is_raw_material, " type: ", type(is_raw_material) @@ -6807,9 +6906,9 @@ def create_edit_asset(request,group_id): asset_obj.fill_gstystem_values(tags=tags) - + rt_teaches = node_collection.one({'_type': "RelationType", 'name': unicode("teaches")}) - + if selected_topic: # selected_topic_list = map(ObjectId,selected_topic_list) create_grelation(asset_obj._id,rt_teaches,ObjectId(selected_topic)) @@ -6826,13 +6925,13 @@ def create_edit_asset(request,group_id): # elif not is_raw_material and u'raw@material' in asset_obj.tags and "base_unit" in group_obj.member_of_names_list: # UNmarking Asset as RawMaterial asset_obj.tags.remove(u'raw@material') - + if "announced_unit" in group_obj.member_of_names_list and title == "raw material": asset_obj.tags.append(u'raw@material') - + if ("announced_unit" in group_obj.member_of_names_list or "Group" in group_obj.member_of_names_list) and "gallery" == title: - asset_obj.tags.append(u'asset@gallery') - + asset_obj.tags.append(u'asset@gallery') + if "announced_unit" in group_obj.member_of_names_list and title == None or title == "None": asset_obj.tags.append(u'asset@asset') @@ -6849,6 +6948,7 @@ def create_edit_asset(request,group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def add_assetcontent(request,group_id): asset_obj = request.POST.get('asset_obj','') if_subtitle = request.POST.get('if_subtitle','') @@ -6874,7 +6974,7 @@ def add_assetcontent(request,group_id): if not file_name: file_name = asset_cont_name subtitle_obj = create_assetcontent(asset_id=ObjectId(asset_obj), - name=file_name, group_name_or_id=group_id, created_by=request.user.id, + name=file_name, group_name_or_id=group_id, created_by=request.user.id, files=uploaded_subtitle,resource_type='File', request=request) rt_subtitle = node_collection.one({'_type':'RelationType', 'name':'has_subtitle'}) @@ -6899,7 +6999,7 @@ def add_assetcontent(request,group_id): rt_transcript = node_collection.one({'_type':'RelationType', 'name':'has_transcript'}) transcript_obj = create_assetcontent(asset_id=ObjectId(asset_obj), - name=file_name, group_name_or_id=group_id, created_by=request.user.id, + name=file_name, group_name_or_id=group_id, created_by=request.user.id, files=uploaded_transcript, resource_type='File', request=request) transcript_list = [ObjectId(transcript_obj._id)] @@ -6916,7 +7016,7 @@ def add_assetcontent(request,group_id): if not file_name: file_name = asset_cont_name alt_file_type = request.POST.get('alt_file_type','') - alt_lang_file_obj = create_assetcontent(asset_id=ObjectId(asset_obj), + alt_lang_file_obj = create_assetcontent(asset_id=ObjectId(asset_obj), name=file_name, group_name_or_id=group_id, created_by=request.user.id, files=uploaded_alt_lang_file,resource_type='File', request=request) rt_alt_content = node_collection.one({'_type':'RelationType', 'name':'has_alt_content'}) @@ -6937,7 +7037,7 @@ def add_assetcontent(request,group_id): resource_type='File', request=request) return StreamingHttpResponse("success") - +@cache_control(must_revalidate=True, max_age=6) def add_to_collection_set(request, group_id): child_node_id = request.POST.get('child_node_id', None) parent_node_id = request.POST.get('parent_node_id', None) @@ -6952,7 +7052,7 @@ def add_to_collection_set(request, group_id): else: return HttpResponse(0) - +@cache_control(must_revalidate=True, max_age=6) def delete_asset(request, group_id): if_delete_asset = request.POST.get('delete_asset', '') if_delete_asset_content = request.POST.get('delete_asset_content', '') @@ -6973,7 +7073,7 @@ def delete_asset(request, group_id): print '\nDeleted Node',del_rel return HttpResponse('success') - +@cache_control(must_revalidate=True, max_age=6) def get_metadata_page(request, group_id): node_id = request.POST.get('node_id', None) node_obj = node_collection.one({'_id':ObjectId(node_id)}) @@ -6984,6 +7084,7 @@ def get_metadata_page(request, group_id): }, context_instance=RequestContext(request)) +@cache_control(must_revalidate=True, max_age=6) def get_admin_page_form(request, group_id): node_id = request.POST.get('node_id', None) node_obj = node_collection.one({'_id':ObjectId(node_id)}) @@ -6994,6 +7095,7 @@ def get_admin_page_form(request, group_id): }, context_instance=RequestContext(request)) +@cache_control(must_revalidate=True, max_age=6) def get_help_page_form(request, group_id): node_id = request.POST.get('node_id', None) node_obj = node_collection.one({'_id':ObjectId(node_id)}) @@ -7004,6 +7106,7 @@ def get_help_page_form(request, group_id): }, context_instance=RequestContext(request)) +@cache_control(must_revalidate=True, max_age=6) def get_interaction_widget(request, group_id): node_id = request.POST.get('node_id', None) node_obj = node_collection.one({'_id':ObjectId(node_id)}) @@ -7012,8 +7115,9 @@ def get_interaction_widget(request, group_id): 'group_id': group_id, 'groupid': group_id, 'node_id':node_id,'node':node_obj }, - context_instance=RequestContext(request)) + context_instance=RequestContext(request)) +@cache_control(must_revalidate=True, max_age=6) def save_interactions(request, group_id): group_obj = get_group_name_id(group_id, get_obj=True) node_id = request.POST.get('node_id', None) @@ -7033,8 +7137,8 @@ def save_interactions(request, group_id): else: create_gattribute(node._id, discussion_enable_at, False) return HttpResponseRedirect(reverse('view_course_page', kwargs={'group_id':ObjectId(group_id),'page_id': ObjectId(node._id)})) - +@cache_control(must_revalidate=True, max_age=6) def save_metadata(request, group_id): node_id = request.POST.get('node_id', None) node = node_collection.one({"_id":ObjectId(node_id)}) @@ -7071,6 +7175,7 @@ def save_metadata(request, group_id): return HttpResponseRedirect(reverse('asset_detail', kwargs={'group_id':ObjectId(group_id),'asset_id': ObjectId(node._id)})) # return HttpResponse('success') +@cache_control(must_revalidate=True, max_age=6) def export_to_epub(request, group_id, node_id): from gnowsys_ndf.ndf.views.export_to_epub import * response_dict = {'success': False} @@ -7086,6 +7191,7 @@ def export_to_epub(request, group_id, node_id): pass return HttpResponseRedirect(reverse('unit_detail', kwargs={'group_id': group_id})) +@cache_control(must_revalidate=True, max_age=6) def remove_related_doc(request, group_id): node = request.POST.get('node', None) selected_obj = request.POST.get('sel_file', None) @@ -7097,6 +7203,7 @@ def remove_related_doc(request, group_id): delete_grelation(subject_id=ObjectId(node_obj.pk), deletion_type=1, **{'node_id': ObjectId(rel_node._id)}) return HttpResponse('success') +@cache_control(must_revalidate=True, max_age=6) def get_translated_node(request, group_id): node_id = request.GET.get('node_id', None) language = request.GET.get('language', None) @@ -7107,14 +7214,14 @@ def get_translated_node(request, group_id): else: return HttpResponse(json.dumps(node_obj, cls=NodeJSONEncoder)) - +@cache_control(must_revalidate=True, max_age=6) @get_execution_time def get_rating_template(request, group_id): try: group_id = ObjectId(group_id) except: group_name, group_id = get_group_name_id(group_id) - + node_id = request.GET.get('node_id', None) node_obj = Node.get_node_by_id(ObjectId(node_id)) is_comments = request.GET.get('if_comments', None) @@ -7129,6 +7236,7 @@ def get_rating_template(request, group_id): }, context_instance=RequestContext(request)) +@cache_control(must_revalidate=True, max_age=6) def delete_curriculum_node(request, group_id): node_id = request.POST.get('node_id', None) node_obj = Node.get_node_by_id(node_id) @@ -7136,4 +7244,3 @@ def delete_curriculum_node(request, group_id): trash_resource(request,ObjectId(group_id),ObjectId(node_id)) trash_resource(request,ObjectId(group_id),ObjectId(node_id)) return HttpResponse("Success") - diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/analytics.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/analytics.py index 6c97fc6a41..2e4dc3c52c 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/analytics.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/analytics.py @@ -21,6 +21,8 @@ from gnowsys_ndf.ndf.models import * from pymongo import Connection +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control try: from bson import ObjectId @@ -39,7 +41,7 @@ ''' FUNCTION TO REGISTER CUSTOM ACTIVITIES USING AJAX ''' - +@cache_control(must_revalidate=True, max_age=6) @get_execution_time def custom_events(request): transaction = { 'status' : None, 'message' : None} @@ -74,13 +76,14 @@ def custom_events(request): ''' USER ANALYTICS VIEWS ''' - @get_execution_time def default_user(request,group_id): return redirect("/") + @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def user_list_activities(request,group_id): ''' @@ -115,6 +118,7 @@ def user_list_activities(request,group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def user_app_activities(request,group_id,part): ''' @@ -182,6 +186,7 @@ def get_user_sessions(user) : @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def user_summary(request,group_id): ''' @@ -219,6 +224,7 @@ def user_summary(request,group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def user_graphs(request) : return render_to_response("ndf/analytics_user_graphs.html", {}) @@ -228,12 +234,14 @@ def user_graphs(request) : ''' @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def default_group(request,group_id): return redirect('/'+group_id+'/analytics/group/summary') @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def group_summary(request,group_id): ''' Renders the summary of all the activities done by the members of the Group @@ -284,6 +292,7 @@ def group_summary(request,group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def group_list_activities(request,group_id): ''' Renders the list of activities of all the members of the group @@ -316,6 +325,7 @@ def group_list_activities(request,group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def group_members(request, group_id) : ''' @@ -383,6 +393,7 @@ def group_members(request, group_id) : @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def group_member_info_details(request, group_id, user) : group_name, group_id = get_group_name_id(group_id) @@ -1068,22 +1079,17 @@ def default_activity(group_id,url,doc): return 1 - def event_activity(group_id,url,doc): return 0 - def group_activity(group_id,url,doc): return 0 - def image_activity(group_id,url,doc): return 0 - def video_activity(group_id,url,doc): return 0 - def Gid(group): group_id = group; ins_objectid = ObjectId() @@ -1101,10 +1107,3 @@ def Gid(group): pass return group_id - - - - - - - diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/analytics_methods.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/analytics_methods.py index 27bac485e5..e48660214a 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/analytics_methods.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/analytics_methods.py @@ -5,6 +5,8 @@ from gnowsys_ndf.ndf.views.methods import get_course_completetion_status, dig_nodes_field, sublistExists from gnowsys_ndf.ndf.templatetags.simple_filters import get_dict_from_list_of_dicts benchmark_collection = db[Benchmark.collection_name] +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control class AnalyticsMethods(object): # print "=== Class Defination === " @@ -829,4 +831,4 @@ def get_total_comments_for_user(self,return_cur_obj=False,site_wide=False): if self.all_comments_on_user_notes or self.all_comments_on_user_files: return self.all_comments_on_user_notes.count() + self.all_comments_on_user_files.count() else: - return 0 \ No newline at end of file + return 0 diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/api_v1.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/api_v1.py index d23682ca76..e7735e0762 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/api_v1.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/api_v1.py @@ -2,6 +2,8 @@ import json import bson from bson.json_util import dumps +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control ''' -- imports from installed packages -- ''' try: @@ -25,7 +27,7 @@ gst_api_fields_dict = { "_id": 1, "name": 1, "altnames": 1, "language": 1, "content": 1, "if_file": 1, "tags": 1, "location": 1, "created_by": 1, "modified_by": 1, "contributors": 1, "legal": 1, "rating": 1, "created_at": 1, "last_update": 1, "collection_set": 1, "post_node": 1, "prior_node": 1, "access_policy": 1, "status": 1, "group_set": 1, "member_of": 1, "type_of": 1, - "relation_set": 1 #,"attribute_set": 1, + "relation_set": 1 #,"attribute_set": 1, } api_name_model_name_dict = { @@ -33,7 +35,7 @@ 'resource_type': 'member_of' } - +@cache_control(must_revalidate=True, max_age=6) def api_get_gs_nodes(request): get_parameters_dict = request.GET.dict() if not get_parameters_dict: @@ -100,7 +102,7 @@ def api_get_gs_nodes(request): if gst_id: oid_name_dict[gst_id] = gst_name get_parameters_dict['member_of'] = gst_id - attributes = sample_gs.get_possible_attributes([gst_id]) + attributes = sample_gs.get_possible_attributes([gst_id]) get_workspace = request.GET.get('workspace', None) if get_workspace: @@ -191,7 +193,7 @@ def gst_attributes(gst_name_or_id): return [at.name for at in node_collection.find({'_type': 'AttributeType', 'subject_type': gst_id})] - +@cache_control(must_revalidate=True, max_age=6) def api_get_field_values(request, field_name): field_name = api_name_model_name_dict.get(field_name, field_name) diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/api_v2.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/api_v2.py index 686ee1d4ab..01425a3c66 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/api_v2.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/api_v2.py @@ -2,7 +2,8 @@ import json import bson from bson.json_util import dumps - +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control ''' -- imports from installed packages -- ''' try: from bson import ObjectId @@ -38,6 +39,7 @@ # TODO: write decorator for making JSON result OPEN API or JSON api compliance @csrf_exempt +@cache_control(must_revalidate=True, max_age=6) def db_schema(request, collection_name='', field_name='', field_value=''): ''' GET /api/v2/schema @@ -48,7 +50,7 @@ def db_schema(request, collection_name='', field_name='', field_value=''): # following URL will list all possible md5: GET /api/v2/schema/Filehive/md5/ - + # following url will return matching document: GET /api/v2/schema/Filehive/md5/2bb048c86ae0aa3d0c496e00d128638bc3576f9dfe4f5aa15dc0a68088bea1c4 ''' @@ -83,6 +85,7 @@ def db_schema(request, collection_name='', field_name='', field_value=''): @csrf_exempt +@cache_control(must_revalidate=True, max_age=6) def api_create_gs(request, gst_name="Page"): # curl -i -X POST -H "Content-Type: multipart/form-data" -F "filehive=@CIET-Mix.csv" -F "content=hey, this is sample content" -F "name=Test the FAB" -F "tags=check, 1, 2, aa" -F 'user_name=administrator' -F 'workspace=warehouse' http://172.17.0.2:8000/api/v2/create/File @@ -90,11 +93,11 @@ def api_create_gs(request, gst_name="Page"): # print "===================:: ", request.POST # print "===================:: ", request.POST.dict() # print "===================:: ", request.FILES - + write_files(request, group_id=request.POST.get('workspace'), unique_gs_per_file=False, kwargs=request.POST.dict()) return HttpResponse(1) - +@cache_control(must_revalidate=True, max_age=6) def api_get_gs_nodes(request): get_parameters_dict = request.GET.dict() @@ -161,7 +164,7 @@ def api_get_gs_nodes(request): gst_name, gst_id = GSystemType.get_gst_name_id(get_resource_type) oid_name_dict[gst_id] = gst_name get_parameters_dict['member_of'] = [gst_id] - attributes = sample_gs.get_possible_attributes([gst_id]) + attributes = sample_gs.get_possible_attributes([gst_id]) get_workspace = request.GET.get('workspace', None) if get_workspace: @@ -251,7 +254,7 @@ def gst_attributes(gst_name_or_id): return [at.name for at in node_collection.find({'_type': 'AttributeType', 'subject_type': gst_id})] - +@cache_control(must_revalidate=True, max_age=6) def api_get_field_values(request, field_name): ''' GET /api/v2/tags diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/assessment_analytics.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/assessment_analytics.py index 6504077660..ee60e28a06 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/assessment_analytics.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/assessment_analytics.py @@ -13,7 +13,6 @@ def hit_qbank_request(url): pass return result_set - def get_assessment_id(domain,bankId,assessmentsoffered_id): # print "\nassessmentsoffered_id: ", assessmentsoffered_id url = str(domain) + ":8080/api/v1/assessment/banks/"+str(bankId)+\ @@ -26,7 +25,7 @@ def get_assessment_id(domain,bankId,assessmentsoffered_id): print "\nError Occurred in get_assessment_id()", get_assessment_id pass return assessmentId - + def get_assessment_items_count(domain, bankId, assessmentId): url = str(domain) + ":8080/api/v1/assessment/banks/"+str(bankId)+\ "/assessments/"+str(assessmentId) + "/items" @@ -101,4 +100,4 @@ def user_assessment_results(domain, guserId,bankId,offeredId): # d = questionCount('https://103.36.84.149', '2','assessment.Bank%3A57e26c92b3fcec4c84a63f27%40ODL.MIT.EDU','assessment.AssessmentOffered%3A58f46bdbd09eca03d7364f1b%40ODL.MIT.EDU') # print "*"*80 -# print d \ No newline at end of file +# print d diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/asset.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/asset.py index b5235860ef..dcdc7faba1 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/asset.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/asset.py @@ -10,6 +10,8 @@ from gnowsys_ndf.ndf.models import node_collection, triple_collection from gnowsys_ndf.ndf.views.methods import get_group_name_id, get_language_tuple, create_grelation, get_execution_time, auto_enroll from gnowsys_ndf.settings import GSTUDIO_BUDDY_LOGIN, GSTUDIO_DEFAULT_LANGUAGE, GSTUDIO_FILE_UPLOAD_POINTS +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control # gst_asset = node_collection.one({'_type': u'GSystemType', 'name': u'Asset'}) gst_asset_name, gst_asset_id = GSystemType.get_gst_name_id(u'Asset') @@ -145,7 +147,7 @@ def create_assetcontent(asset_id, {'_id': 0, 'right_subject': 1}) for each_asset in asset_grels: asset_contents_list.append(each_asset['right_subject']) - + create_grelation(asset_obj._id, rt_has_asset_content, asset_contents_list) active_user_ids_list = [request.user.id] if GSTUDIO_BUDDY_LOGIN: diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/audioDashboard.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/audioDashboard.py index 699e12294d..4994d6e487 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/audioDashboard.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/audioDashboard.py @@ -4,6 +4,8 @@ from django.core.urlresolvers import reverse from django.shortcuts import render_to_response, render from django.template import RequestContext +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control try: from bson import ObjectId @@ -17,13 +19,14 @@ from gnowsys_ndf.ndf.views.methods import get_node_common_fields,create_grelation_list,get_execution_time from gnowsys_ndf.ndf.views.methods import get_node_metadata, node_thread_access, create_thread_for_node from gnowsys_ndf.ndf.management.commands.data_entry import create_gattribute -from gnowsys_ndf.ndf.views.methods import get_node_metadata, get_node_common_fields, create_gattribute, get_page, get_execution_time,set_all_urls,get_group_name_id +from gnowsys_ndf.ndf.views.methods import get_node_metadata, get_node_common_fields, create_gattribute, get_page, get_execution_time,set_all_urls,get_group_name_id gapp_mt = node_collection.one({'_type': "MetaType", 'name': META_TYPE[0]}) GST_AUDIO = node_collection.one({'member_of': gapp_mt._id, 'name': GAPPS[3]}) file_gst = node_collection.find_one( { "_type" : "GSystemType","name":"File" } ) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def audioDashboard(request, group_id, audio_id=None): ''' @@ -39,7 +42,7 @@ def audioDashboard(request, group_id, audio_id=None): 'member_of': file_gst._id, 'group_set': {'$all': [ObjectId(group_id)]}, 'if_file.mime_type': {'$regex': 'audio'}, - 'status' : { '$ne': u"DELETED" } + 'status' : { '$ne': u"DELETED" } # 'created_by': {'$in': gstaff_users}, # '$or': [ diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/batch.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/batch.py index 32bb6e713b..4416fc7020 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/batch.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/batch.py @@ -4,6 +4,9 @@ from django.template import RequestContext from django.core.urlresolvers import reverse from django.contrib.auth.decorators import login_required +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control + import json from mongokit import IS @@ -23,6 +26,7 @@ @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def batch(request, group_id): """ * Renders a list of all 'batches' available within the database. @@ -82,6 +86,7 @@ def batch(request, group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def new_create_and_edit(request, group_id, _id=None): # node = "" # count = "" @@ -139,7 +144,7 @@ def new_create_and_edit(request, group_id, _id=None): variable = RequestContext(request, { 'group_id': group_id, 'groupid': group_id, 'appId': app._id, 'title': GST_BATCH.name, 'ATs': req_ATs, - 'count': batch_count, 'batch_count': xrange(batch_count), 'st_batch_id': GST_BATCH._id, + 'count': batch_count, 'batch_count': xrange(batch_count), 'st_batch_id': GST_BATCH._id, 'ac_node': ac, 'student_count': student_coll.count(), 'nussd_course_name': nussd_course_name, @@ -151,6 +156,7 @@ def new_create_and_edit(request, group_id, _id=None): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def save_students_for_batches(request, group_id): ''' This save method creates new and update existing the batches @@ -169,6 +175,7 @@ def save_students_for_batches(request, group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def save_batch(request, group_id): # def save_batch(batch_name, user_list, group_id, request, ac_id): @@ -222,6 +229,7 @@ def save_batch(request, group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def detail(request, group_id, _id): student_coll = [] node = node_collection.one({'_id':ObjectId(_id)}) @@ -237,6 +245,7 @@ def detail(request, group_id, _id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def remove_stud_from_batch(request, group_id): group_name, group_id = get_group_name_id(group_id) if request.is_ajax() and request.method == "POST": @@ -282,6 +291,7 @@ def remove_stud_from_batch(request, group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def batch_detail(request, group_id): group_name, group_id = get_group_name_id(group_id) new_batch_node = None @@ -302,6 +312,7 @@ def batch_detail(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def delete_batch(request, group_id, _id): group_name, group_id = get_group_name_id(group_id) @@ -344,6 +355,7 @@ def delete_batch(request, group_id, _id): @login_required +@cache_control(must_revalidate=True, max_age=6) def get_possible_batches(request, group_id): ''' Returns: diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/bbb_api.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/bbb_api.py old mode 100755 new mode 100644 index 34054c5fcc..7cb08f704b --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/bbb_api.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/bbb_api.py @@ -1,10 +1,12 @@ import urllib, urllib2, socket import hashlib, random -from xml.dom import minidom -from xml.dom.minidom import Node +from xml.dom import minidom +from xml.dom.minidom import Node +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control -# ----------------------UTILITY FUNCTIONS-------------------------------------- +# ----------------------UTILITY FUNCTIONS-------------------------------------- def bbb_wrap_load_file(url): timeout = 10 socket.setdefaulttimeout(timeout) @@ -14,26 +16,24 @@ def bbb_wrap_load_file(url): return minidom.parse(req) except: return False - def assign2Dict(xml): try: mapping = {} response = xml.firstChild for child in response.childNodes: - + if( child.hasChildNodes() ): mapping[child.tagName] = child.firstChild.nodeValue else: mapping[child.tagName] = None - + return mapping except: return False - -# --------------------------GET URLs------------------------------------------- +# --------------------------GET URLs------------------------------------------- def joinURL(meetingID, username, PW, SALT, URL): ''' @@ -51,16 +51,15 @@ def joinURL(meetingID, username, PW, SALT, URL): ''' url_join = URL + "api/join?" - + parameters = {'meetingID' : meetingID, 'fullName' : username, 'password' : PW, } - + parameters = urllib.urlencode(parameters) return url_join + parameters + '&checksum=' + hashlib.sha1("join" + parameters + SALT).hexdigest() - def createMeetingURL(name, meetingID, attendeePW, moderatorPW, welcome, logoutURL, SALT, URL): ''' This method returns the url to join the specified meeting. @@ -90,18 +89,17 @@ def createMeetingURL(name, meetingID, attendeePW, moderatorPW, welcome, logoutUR } parameters = urllib.urlencode(parameters) - + welcome_parameters = '' if (welcome and welcome != ''): - welcome_parameters = {'welcome': welcome.strip()} + welcome_parameters = {'welcome': welcome.strip()} welcome_parameters = urllib.urlencode(welcome_parameters) welcome_parameters = "&" + welcome_parameters - + params = parameters + welcome_parameters - return url_create + params + '&checksum=' + hashlib.sha1("create" + params + SALT).hexdigest() + return url_create + params + '&checksum=' + hashlib.sha1("create" + params + SALT).hexdigest() # -------------------------------------CREATE---------------------------------- - def createMeeting(username, meetingID, welcomeString, mPW, aPW, SALT, URL, logoutURL ): ''' This method creates a meeting and return an array of the xml packet @@ -125,7 +123,7 @@ def createMeeting(username, meetingID, welcomeString, mPW, aPW, SALT, URL, logou xml = bbb_wrap_load_file( create_url ) if(xml): - return assign2Dict(xml) - + return assign2Dict(xml) + #if unable to reach the server return None diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/buddy.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/buddy.py index de4509808c..050b8a1d40 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/buddy.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/buddy.py @@ -7,6 +7,8 @@ from django.template import RequestContext from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control try: from bson import ObjectId @@ -20,6 +22,7 @@ @login_required +@cache_control(must_revalidate=True, max_age=6) def list_buddy(request, group_id='home'): ''' @@ -58,6 +61,7 @@ def list_buddy(request, group_id='home'): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def update_buddies(request, group_id): selected_buddies_list = eval(request.POST.get('selected_buddies_list', '[]')) @@ -134,6 +138,7 @@ def update_buddies(request, group_id): # @get_execution_time # @login_required +@cache_control(must_revalidate=True, max_age=6) def search_authors(request, group_id): selected_ids = request.GET.get('selected_ids', '') selected_ids = selected_ids.split(',') @@ -149,7 +154,7 @@ def search_authors(request, group_id): ) ) - +@cache_control(must_revalidate=True, max_age=6) def get_buddy_auth_id_from_name(request, group_id, username=None): response_dict ={'success': False} username = request.GET.get('selected_buddy_username') @@ -158,5 +163,5 @@ def get_buddy_auth_id_from_name(request, group_id, username=None): if auth_node and (auth_node.created_by not in sitewide_active_userids_list): response_dict.update({'auth_id': str(auth_node._id)}) response_dict.update({'success': True}) - - return HttpResponse(json.dumps(response_dict)) \ No newline at end of file + + return HttpResponse(json.dumps(response_dict)) diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/cache.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/cache.py index f939295886..555ca2aa75 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/cache.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/cache.py @@ -2,10 +2,13 @@ from django.shortcuts import render_to_response from django.conf import settings from django.core.cache import cache +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control import datetime, re import subprocess +@cache_control(must_revalidate=True, max_age=6) def cache_status(request): try: @@ -78,7 +81,6 @@ class Stats: all_cached_items=all_items_list, )) - def invalidate_cache_page(view_name, args=[], namespace=None, key_prefix=None): """ This function allows you to invalidate any view-level cache which is implemented @@ -114,7 +116,6 @@ def invalidate_cache_page(view_name, args=[], namespace=None, key_prefix=None): return True return False - def invalidate_set_cache(cache_key): ''' Invalidates cache set by cache.set() method. diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/course.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/course.py index c0173dcdbf..5baaf93721 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/course.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/course.py @@ -15,6 +15,9 @@ from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required from django.contrib.sites.models import Site +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control + from mongokit import IS try: from bson import ObjectId @@ -43,6 +46,7 @@ @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def course(request, group_id, course_id=None): """ * Renders a list of all 'courses' available within the database. @@ -80,7 +84,7 @@ def course(request, group_id, course_id=None): # title = GST_COURSE.name # if GST_COURSE.name == "Course": title = "eCourses" - + query = {'member_of': ce_gst._id,'_id':{'$in': group_obj_post_node_list}} gstaff_access = False if request.user.id: @@ -117,6 +121,7 @@ def course(request, group_id, course_id=None): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def create_edit(request, group_id, node_id=None): """Creates/Modifies details about the given quiz-item. """ @@ -166,8 +171,8 @@ def create_edit(request, group_id, node_id=None): # get_node_common_fields(request, course_node, group_id, GST_COURSE) course_node.save(is_changed=get_node_common_fields(request, course_node, group_id, GST_COURSE),groupid=group_id) create_gattribute(course_node._id, at_course_type, u"General") - - # adding thumbnail + + # adding thumbnail f = request.FILES.get("doc", "") # print "\nf is ",f @@ -222,6 +227,7 @@ def create_edit(request, group_id, node_id=None): # @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def course_detail(request, group_id, _id): # ins_objectid = ObjectId() # if ins_objectid.is_valid(group_id) is False: @@ -306,6 +312,7 @@ def course_detail(request, group_id, _id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def course_create_edit(request, group_id, app_id, app_set_id=None, app_set_instance_id=None, app_name=None): """ Creates/Modifies document of given sub-types of Course(s). @@ -818,6 +825,7 @@ def course_create_edit(request, group_id, app_id, app_set_id=None, app_set_insta @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def mis_course_detail(request, group_id, app_id=None, app_set_id=None, app_set_instance_id=None, app_name=None): """ Detail view of NUSSD Course/ Announced Course @@ -1020,7 +1028,7 @@ def mis_course_detail(request, group_id, app_id=None, app_set_id=None, app_set_i context_variables = { 'groupid': group_id, 'group_id': group_id, - 'app_id': app_id, 'app_name': app_name, 'app_collection_set': app_collection_set, + 'app_id': app_id, 'app_name': app_name, 'app_collection_set': app_collection_set, 'app_set_id': app_set_id, 'course_gst_name': course_gst.name, 'title': title, @@ -1036,26 +1044,27 @@ def mis_course_detail(request, group_id, app_id=None, app_set_id=None, app_set_i # print "\n template-list: ", [template, default_template] # template = "ndf/fgh.html" # default_template = "ndf/dsfjhk.html" - # return render_to_response([template, default_template], + # return render_to_response([template, default_template], return render_to_response(template, context_variables, context_instance = RequestContext(request) ) - + except TemplateDoesNotExist as tde: error_message = "\n CourseDetailListViewError: This html template (" + str(tde) + ") does not exists !!!\n" raise Http404(error_message) - + except Exception as e: error_message = "\n CourseDetailListViewError: " + str(e) + " !!!\n" raise Exception(error_message) -# Ajax views for setting up Course Structure +# Ajax views for setting up Course Structure @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def create_course_struct(request, group_id, node_id): """ This view is to create the structure of the Course. @@ -1147,6 +1156,7 @@ def create_course_struct(request, group_id, node_id): @login_required +@cache_control(must_revalidate=True, max_age=6) def save_course_section(request, group_id): ''' Accepts: @@ -1193,6 +1203,7 @@ def save_course_section(request, group_id): @login_required +@cache_control(must_revalidate=True, max_age=6) def save_course_sub_section(request, group_id): ''' Accepts: @@ -1244,6 +1255,7 @@ def save_course_sub_section(request, group_id): @login_required +@cache_control(must_revalidate=True, max_age=6) def change_node_name(request, group_id): ''' Accepts: @@ -1266,6 +1278,7 @@ def change_node_name(request, group_id): @login_required +@cache_control(must_revalidate=True, max_age=6) def change_order(request, group_id): ''' Accepts: @@ -1291,13 +1304,14 @@ def change_order(request, group_id): a, b = collection_set_list.index(ObjectId(node_id_up)), collection_set_list.index(ObjectId(node_id_down)) collection_set_list[b], collection_set_list[a] = collection_set_list[a], collection_set_list[b] node_collection.collection.update({'_id': parent_node._id}, {'$set': {'collection_set': collection_set_list }}, upsert=False, multi=False) - + parent_node.reload() response_dict["success"] = True return HttpResponse(json.dumps(response_dict)) @login_required +@cache_control(must_revalidate=True, max_age=6) def course_sub_section_prop(request, group_id): ''' Accepts: @@ -1365,6 +1379,7 @@ def course_sub_section_prop(request, group_id): @login_required +@cache_control(must_revalidate=True, max_age=6) def add_units(request, group_id): ''' Accepts: @@ -1408,6 +1423,7 @@ def add_units(request, group_id): @login_required +@cache_control(must_revalidate=True, max_age=6) def get_resources(request, group_id): ''' Accepts: @@ -1489,6 +1505,7 @@ def get_resources(request, group_id): @login_required +@cache_control(must_revalidate=True, max_age=6) def save_resources(request, group_id): ''' Accepts: @@ -1564,6 +1581,7 @@ def save_resources(request, group_id): @login_required +@cache_control(must_revalidate=True, max_age=6) def create_edit_unit(request, group_id): ''' Accepts: @@ -1618,6 +1636,7 @@ def create_edit_unit(request, group_id): @login_required +@cache_control(must_revalidate=True, max_age=6) def delete_course(request, group_id, node_id): del_stat = delete_item(node_id, "CourseUnit") if del_stat: @@ -1625,6 +1644,7 @@ def delete_course(request, group_id, node_id): @login_required +@cache_control(must_revalidate=True, max_age=6) def delete_from_course_structure(request, group_id): ''' Accepts: @@ -1658,7 +1678,6 @@ def delete_from_course_structure(request, group_id): return HttpResponse(json.dumps(response_dict)) - def delete_item(item, ce_flag): node_item = node_collection.one({'_id': ObjectId(item)}) if ce_flag: @@ -1679,6 +1698,7 @@ def delete_item(item, ce_flag): @login_required +@cache_control(must_revalidate=True, max_age=6) def enroll_generic(request, group_id): response_dict = {"success": False} if request.is_ajax() and request.method == "POST": @@ -1711,6 +1731,7 @@ def enroll_generic(request, group_id): @login_required +@cache_control(must_revalidate=True, max_age=6) def remove_resource_from_unit(request, group_id): ''' Accepts: @@ -1732,13 +1753,14 @@ def remove_resource_from_unit(request, group_id): if unit_node.collection_set and res_id: node_collection.collection.update({'_id': unit_node._id}, {'$pull': {'collection_set': ObjectId(res_id)}}, upsert=False, multi=False) - + response_dict["success"] = True return HttpResponse(json.dumps(response_dict)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def add_course_file(request, group_id): # this is context node getting from the url get request context_node_id = request.GET.get('context_node', '') @@ -1774,11 +1796,12 @@ def add_course_file(request, group_id): context_node.collection_set.append(file_node._id) file_node.prior_node.append(context_node._id) file_node.save() - + return HttpResponseRedirect(url_name) @login_required +@cache_control(must_revalidate=True, max_age=6) def enroll_to_course(request, group_id): ''' Accepts: @@ -1801,6 +1824,7 @@ def enroll_to_course(request, group_id): response_dict["success"] = True return HttpResponse(json.dumps(response_dict)) +@cache_control(must_revalidate=True, max_age=6) def set_release_date_css(request, group_id): response_dict = {"success": False} try: @@ -1820,4 +1844,3 @@ def set_release_date_css(request, group_id): response_dict["success"] = False response_dict["message"] = "Something went wrong! Please try after some time" return HttpResponse(json.dumps(response_dict)) - diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/curriculum.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/curriculum.py index acfb396c6e..05807f54dd 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/curriculum.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/curriculum.py @@ -9,7 +9,8 @@ from django.core.urlresolvers import reverse from django.shortcuts import render_to_response, render from django.template import RequestContext - +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control from mongokit import paginator try: @@ -34,6 +35,7 @@ ####################################################################################################################################### @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def curriculum(request, group_id, app_id=None, app_set_id=None): try: @@ -52,10 +54,10 @@ def curriculum(request, group_id, app_id=None, app_set_id=None): # Code for user shelf shelves = [] shelf_list = {} - auth = node_collection.one({'_type': 'Author', 'name': unicode(request.user.username) }) - + auth = node_collection.one({'_type': 'Author', 'name': unicode(request.user.username) }) + # --- shelf commented for time being --- - # + # # if auth: # has_shelf_RT = node_collection.one({'_type': 'RelationType', 'name': u'has_shelf' }) # shelf = triple_collection.find({'_type': 'GRelation', 'subject': ObjectId(auth._id), 'relation_type': has_shelf_RT._id}) @@ -63,7 +65,7 @@ def curriculum(request, group_id, app_id=None, app_set_id=None): # if shelf: # for each in shelf: - # shelf_name = node_collection.one({'_id': ObjectId(each.right_subject)}) + # shelf_name = node_collection.one({'_id': ObjectId(each.right_subject)}) # shelves.append(shelf_name) # shelf_list[shelf_name.name] = [] @@ -91,18 +93,18 @@ def curriculum(request, group_id, app_id=None, app_set_id=None): # topics_GST = node_collection.find_one({'_type': 'GSystemType', 'name': 'Topics'}) topics_GST = app - + if unfold_tree: unfold = unfold_tree - + if app_set_id: themes_list_items = True app_GST = node_collection.find_one({"_id": ObjectId(app_set_id)}) - + if app_GST: title = theme_GST.name nodes = list(node_collection.find({'member_of': {'$all': [theme_GST._id]},'group_set':{'$all': [ObjectId(group_id)]}})) - + nodes_dict = [] for each in nodes: nodes_dict.append({"id":str(each._id), "name":each.name, "created_by":User.objects.get(id=each.created_by).username, "created_at":each.created_at}) @@ -122,7 +124,7 @@ def curriculum(request, group_id, app_id=None, app_set_id=None): # nodes_dict = node_collection.find({'member_of': {'$all': [theme_GST._id]},'group_set':{'$all': [ObjectId(group_id)]}}) # else: # nodes_dict = node_collection.find({'member_of': {'$all': [theme_GST._id]},'group_set':{'$all': [ObjectId(group_id)]}}) - + lang = list(get_language_tuple(request.LANGUAGE_CODE)) nodes_dict = node_collection.find({'member_of': {'$all': [theme_GST._id]},'group_set':{'$all': [ObjectId(group_id)]}, 'language': lang}) @@ -134,11 +136,11 @@ def curriculum(request, group_id, app_id=None, app_set_id=None): 'themes_hierarchy': themes_hierarchy, 'unfold': unfold, 'appId':app._id, }, - - context_instance = RequestContext(request) - ) + context_instance = RequestContext(request) + ) +@cache_control(must_revalidate=True, max_age=6) def list_themes(request, group_id): try: @@ -147,15 +149,15 @@ def list_themes(request, group_id): group_name, group_id = get_group_name_id(group_id) title = theme_GST.name - + nodes = node_collection.find({ 'member_of': {'$all': [theme_GST._id]}, 'group_set':{'$all': [ObjectId(group_id)]} }, {'_id': 1, 'name': 1, 'created_by': 1, 'created_at': 1}) - + return render_to_response("ndf/list_themes.html", - { + { 'groupid': group_id, 'group_id': group_id, 'nodes': nodes, @@ -163,7 +165,7 @@ def list_themes(request, group_id): }, context_instance = RequestContext(request) ) - +@cache_control(must_revalidate=True, max_age=6) def curriculum_list(request, group_id): try: @@ -172,14 +174,14 @@ def curriculum_list(request, group_id): group_name, group_id = get_group_name_id(group_id) title = theme_GST.name - + nodes = node_collection.find({ 'member_of': {'$all': [theme_GST._id]}, 'group_set':{'$all': [ObjectId(group_id)]} }) - + return render_to_response("ndf/curriculum_listing.html", - { + { 'groupid': group_id, 'group_id': group_id, 'nodes': nodes, @@ -187,6 +189,7 @@ def curriculum_list(request, group_id): }, context_instance = RequestContext(request) ) +@cache_control(must_revalidate=True, max_age=6) def curriculum_create_edit(request, group_id,curriculum_id=None): def _update_curr_hierarchy(hierarchy_obj): # d is list fo dict @@ -226,8 +229,8 @@ def _update_curr_hierarchy(hierarchy_obj): theme_gs_obj = node_collection.collection.GSystem() theme_gs_obj.fill_gstystem_values(request=request, name=str(curr_name), - group_set=group_id,content_org=unicode(curr_desc),member_of=theme_GST._id) - theme_gs_obj.save(group_id=group_id) + group_set=group_id,content_org=unicode(curr_desc),member_of=theme_GST._id) + theme_gs_obj.save(group_id=group_id) return HttpResponse(theme_gs_obj._id) else: # data = "" @@ -256,7 +259,7 @@ def _update_curr_hierarchy(hierarchy_obj): context_variables, context_instance=RequestContext(request)) - +@cache_control(must_revalidate=True, max_age=6) def delete_theme(request, group_id, theme_id): try: @@ -279,6 +282,7 @@ def delete_theme(request, group_id, theme_id): coll_set_dict={} @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def theme_topic_create_edit(request, group_id, app_set_id=None): ##################### @@ -299,8 +303,8 @@ def theme_topic_create_edit(request, group_id, app_set_id=None): except: group_name, group_id = get_group_name_id(group_id) - ###################### - + ###################### + nodes_dict = [] create_edit = True themes_hierarchy = False @@ -315,7 +319,7 @@ def theme_topic_create_edit(request, group_id, app_set_id=None): nodes_list = [] parent_nodes_collection = "" translate=request.GET.get('translate','') - + app_GST = node_collection.find_one({"_id":ObjectId(app_set_id)}) if app_GST._id != theme_GST._id: app_obj = node_collection.one({'_id': ObjectId(app_GST.member_of[0])}) @@ -328,8 +332,8 @@ def theme_topic_create_edit(request, group_id, app_set_id=None): shelves = [] shelf_list = {} - auth = node_collection.one({'_type': 'Author', 'name': unicode(request.user.username) }) - + auth = node_collection.one({'_type': 'Author', 'name': unicode(request.user.username) }) + if auth: has_shelf_RT = node_collection.one({'_type': 'RelationType', 'name': u'has_shelf' }) shelf = triple_collection.find({'_type': 'GRelation', 'subject': ObjectId(auth._id), 'relation_type': has_shelf_RT._id}) @@ -337,10 +341,10 @@ def theme_topic_create_edit(request, group_id, app_set_id=None): if shelf: for each in shelf: - shelf_name = node_collection.one({'_id': ObjectId(each.right_subject)}) + shelf_name = node_collection.one({'_id': ObjectId(each.right_subject)}) shelves.append(shelf_name) - shelf_list[shelf_name.name] = [] + shelf_list[shelf_name.name] = [] for ID in shelf_name.collection_set: shelf_item = node_collection.one({'_id': ObjectId(ID) }) shelf_list[shelf_name.name].append(shelf_item.name) @@ -348,11 +352,11 @@ def theme_topic_create_edit(request, group_id, app_set_id=None): else: shelves = [] - + if request.method == "POST": - + if app_GST: - + create_edit = True themes_list_items = "" root_themes = [] @@ -363,25 +367,25 @@ def theme_topic_create_edit(request, group_id, app_set_id=None): prior_node_list = request.POST.get('prior_node_list','') teaches_list = request.POST.get('teaches_list','') assesses_list = request.POST.get('assesses_list','') - - + + # To find the root nodes to maintain the uniquness while creating and editing themes nodes = node_collection.find({'member_of': {'$all': [theme_GST._id]},'group_set':{'$all': [ObjectId(group_id)]}}) for each in nodes: if each.collection_set: for k in each.collection_set: nodes_list.append(k) - + nodes.rewind() for each in nodes: if each._id not in nodes_list: root_themes.append(each.name) root_themes_id.append(each._id) - + if app_GST.name == "Theme" or app_GST.name == "Topic" or translate == "true": # For creating new themes & Topics - themes_list_items = False + themes_list_items = False create_edit = False themes_hierarchy = False themes_cards = True @@ -398,7 +402,7 @@ def theme_topic_create_edit(request, group_id, app_set_id=None): coll_set1=get_coll_set(app_GST._id) for each in coll_set1: theme_topic_node = node_collection.collection.GSystem() - + if "Theme" in each.member_of_names_list: app_obj = theme_GST if "theme_item" in each.member_of_names_list: @@ -426,63 +430,63 @@ def theme_topic_create_edit(request, group_id, app_set_id=None): sub_node = node_collection.one({'_id':ObjectId(str(n))}) parent_node.collection_set.append(sub_node._id) parent_node.save(groupid=group_id) - - - + + + # To return themes card view for listing theme nodes after creating new Themes nodes.rewind() nodes_dict = nodes - + else: - themes_list_items = False + themes_list_items = False create_edit = False themes_hierarchy = True theme_topic_node = node_collection.one({'_id': ObjectId(app_GST._id)}) - - # For edititng themes + + # For edititng themes if theme_GST._id in app_GST.member_of and translate != "true": # To find themes uniqueness within the context of its parent Theme collection, while editing theme name - root_themes = [] + root_themes = [] nodes = node_collection.find({'member_of': {'$all': [theme_GST._id]},'group_set':{'$all': [ObjectId(group_id)]}}) for each in nodes: root_themes.append(each.name) - + if name: if name.upper() != theme_topic_node.name.upper(): if not name.upper() in (theme_name.upper() for theme_name in root_themes): # get_node_common_fields(request, theme_topic_node, group_id, theme_GST) theme_topic_node.save(is_changed=get_node_common_fields(request, theme_topic_node, group_id, theme_GST),groupid=group_id) - + else: theme_topic_node.save(is_changed=get_node_common_fields(request, theme_topic_node, group_id, theme_GST),groupid=group_id) - + if translate != "true": # For storing and maintaning collection order if collection_list != '': theme_topic_node.collection_set = [] collection_list = collection_list.split(",") - + i = 0 while (i < len(collection_list)): node_id = ObjectId(collection_list[i]) - + if node_collection.one({"_id": node_id}): theme_topic_node.collection_set.append(node_id) - + i = i+1 - - theme_topic_node.save(groupid=group_id) - + + theme_topic_node.save(groupid=group_id) + # End of storing collection title = theme_GST.name nodes.rewind() nodes_dict = nodes - # This will return to Themes Hierarchy - themes_list_items = False + # This will return to Themes Hierarchy + themes_list_items = False create_edit = False themes_hierarchy = False themes_cards = True @@ -494,13 +498,13 @@ def theme_topic_create_edit(request, group_id, app_set_id=None): dict_drawer = {} dict2 = [] node = app_GST - prior_theme_collection = [] + prior_theme_collection = [] parent_nodes_collection = "" # To display the theme-topic drawer while create or edit theme checked = "theme_item" # drawers = get_drawers(group_id, node._id, node.collection_set, checked) - # Code for fetching drawer2 + # Code for fetching drawer2 for k in node.collection_set: obj = node_collection.one({'_id': ObjectId(k) }) dict2.append(obj) @@ -511,7 +515,7 @@ def theme_topic_create_edit(request, group_id, app_set_id=None): # End of code for drawer2 drawer = dict_drawer['2'] - + # To find themes uniqueness within the context of its parent Theme collection, while editing theme item nodes = node_collection.find({'member_of': {'$all': [theme_item_GST._id]},'group_set':{'$all': [ObjectId(group_id)]}}) for each in nodes: @@ -519,11 +523,11 @@ def theme_topic_create_edit(request, group_id, app_set_id=None): for k in each.collection_set: prior_theme = node_collection.one({'_id': ObjectId(k) }) prior_theme_collection.append(prior_theme.name) - - parent_nodes_collection = json.dumps(prior_theme_collection) + + parent_nodes_collection = json.dumps(prior_theme_collection) if not prior_theme_collection: - root_nodes = node_collection.find({'member_of': {'$all': [theme_GST._id]},'group_set':{'$all': [ObjectId(group_id)]}}) + root_nodes = node_collection.find({'member_of': {'$all': [theme_GST._id]},'group_set':{'$all': [ObjectId(group_id)]}}) for k in root_nodes: if app_GST._id in k.collection_set: root_themes = [] @@ -531,152 +535,152 @@ def theme_topic_create_edit(request, group_id, app_set_id=None): for l in k.collection_set: objs = node_collection.one({'_id': ObjectId(l)}) root_themes.append(objs.name) - root_themes_id.append(objs._id) + root_themes_id.append(objs._id) # End of finding unique theme names for editing name - + # For adding a sub-theme-items and maintianing their uniqueness within their context nodes_list = [] for each in app_GST.collection_set: sub_theme = node_collection.one({'_id': ObjectId(each) }) nodes_list.append(sub_theme.name) - + nodes_list = json.dumps(nodes_list) # End of finding unique sub themes - + if name: if name.upper() != theme_topic_node.name.upper(): - # If "Name" has changed + # If "Name" has changed - if theme_topic_node._id in root_themes_id: + if theme_topic_node._id in root_themes_id: # If editing node in root theme items if not name.upper() in (theme_name.upper() for theme_name in root_themes): # get_node_common_fields(request, theme_topic_node, group_id, theme_GST) theme_topic_node.save(is_changed=get_node_common_fields(request, theme_topic_node, group_id, theme_item_GST),groupid=group_id) else: - # If editing theme item in prior_theme_collection hierarchy - if not name.upper() in (theme_name.upper() for theme_name in prior_theme_collection): + # If editing theme item in prior_theme_collection hierarchy + if not name.upper() in (theme_name.upper() for theme_name in prior_theme_collection): # get_node_common_fields(request, theme_topic_node, group_id, theme_GST) - theme_topic_node.save(is_changed=get_node_common_fields(request, theme_topic_node, group_id, theme_item_GST),groupid=group_id) - + theme_topic_node.save(is_changed=get_node_common_fields(request, theme_topic_node, group_id, theme_item_GST),groupid=group_id) + else: # If name not changed but other fields has changed - theme_topic_node.save(is_changed=get_node_common_fields(request, theme_topic_node, group_id, theme_item_GST),groupid=group_id) + theme_topic_node.save(is_changed=get_node_common_fields(request, theme_topic_node, group_id, theme_item_GST),groupid=group_id) if translate != "true" and collection_list: - # For storing and maintaning collection order + # For storing and maintaning collection order if collection_list != '': theme_topic_node.collection_set = [] collection_list = collection_list.split(",") - + i = 0 while (i < len(collection_list)): node_id = ObjectId(collection_list[i]) - + if node_collection.one({"_id": node_id}): theme_topic_node.collection_set.append(node_id) - + i = i+1 - theme_topic_node.save(groupid=group_id) + theme_topic_node.save(groupid=group_id) # End of storing collection - # This will return to Themes items edit + # This will return to Themes items edit if theme_topic_node: theme_topic_node.reload() node = theme_topic_node create_edit = True themes_hierarchy = False - - + + # For editing topics elif topic_GST._id in app_GST.member_of: root_topics = [] nodes_list = [] - + # To find the root nodes to maintain the uniquness while creating and editing topics nodes = node_collection.find({'member_of': {'$all': [topic_GST._id]},'group_set':{'$all': [ObjectId(group_id)]}}) for each in nodes: if each.collection_set: for k in each.collection_set: nodes_list.append(k) - + nodes.rewind() for each in nodes: if each._id not in nodes_list: root_topics.append(each.name) # End of finding the root nodes - + if name: if theme_topic_node.name != name: topic_name = theme_topic_node.name if not name.upper() in (theme_name.upper() for theme_name in root_topics): theme_topic_node.save(is_changed=get_node_common_fields(request, theme_topic_node, group_id, topic_GST),groupid=group_id) - + elif topic_name.upper() == name.upper(): - theme_topic_node.save(is_changed=get_node_common_fields(request, theme_topic_node, group_id, topic_GST),groupid=group_id) - + theme_topic_node.save(is_changed=get_node_common_fields(request, theme_topic_node, group_id, topic_GST),groupid=group_id) + else: theme_topic_node.save(is_changed=get_node_common_fields(request, theme_topic_node, group_id, topic_GST),groupid=group_id) - + if collection_list: # For storing and maintaning collection order if collection_list != '': theme_topic_node.collection_set = [] collection_list = collection_list.split(",") - + i = 0 while (i < len(collection_list)): node_id = ObjectId(collection_list[i]) - + if node_collection.one({"_id": node_id}): theme_topic_node.collection_set.append(node_id) - + i = i+1 theme_topic_node.save(groupid=group_id) - - title = topic_GST.name - + + title = topic_GST.name + # To fill the metadata info while creating and editing topic node - metadata = request.POST.get("metadata_info", '') + metadata = request.POST.get("metadata_info", '') if metadata: # Only while metadata editing if metadata == "metadata": if theme_topic_node: get_node_metadata(request,theme_topic_node) # End of filling metadata - - + + if prior_node_list != '': theme_topic_node.prior_node = [] prior_node_list = prior_node_list.split(",") - + i = 0 while (i < len(prior_node_list)): node_id = ObjectId(prior_node_list[i]) if node_collection.one({"_id": node_id}): theme_topic_node.prior_node.append(node_id) - + i = i+1 - + theme_topic_node.save(groupid=group_id) - + if teaches_list !='': teaches_list=teaches_list.split(",") - + create_grelation_list(theme_topic_node._id,"teaches",teaches_list) - - - + + + if assesses_list !='': assesses_list=assesses_list.split(",") - + create_grelation_list(theme_topic_node._id,"assesses",assesses_list) - - # This will return to edit topic + + # This will return to edit topic if theme_topic_node: theme_topic_node.reload() node = theme_topic_node @@ -687,52 +691,52 @@ def theme_topic_create_edit(request, group_id, app_set_id=None): else: app_node = None nodes_list = [] - + app_GST = node_collection.find_one({"_id":ObjectId(app_set_id)}) # print "\napp_GST in else: ",app_GST.name,"\n" - + if app_GST: # For adding new Theme & Topic if app_GST.name == "Theme" or app_GST.name == "Topic" or translate == True: title = app_GST.name node = "" root_themes = [] - + # To find the root nodes to maintain the uniquness while creating new themes nodes = node_collection.find({'member_of': {'$all': [app_GST._id]},'group_set':{'$all': [ObjectId(group_id)]}}) for each in nodes: if each.collection_set: for k in each.collection_set: nodes_list.append(k) - + nodes.rewind() for each in nodes: if each._id not in nodes_list: root_themes.append(each.name) - - + + root_themes = json.dumps(root_themes) nodes_list = root_themes # End of finding unique root level Themes - + else: if theme_GST._id in app_GST.member_of: title = "Theme" node = app_GST - prior_theme_collection = [] + prior_theme_collection = [] parent_nodes_collection = "" drawer = [] # End of editing Themes - - + + # For editing theme item if theme_item_GST._id in app_GST.member_of: title = "Theme Item" dict_drawer = {} dict2 = [] node = app_GST - prior_theme_collection = [] + prior_theme_collection = [] parent_nodes_collection = "" # To display the theme-topic drawer while create or edit theme checked = "theme_item" @@ -744,7 +748,7 @@ def theme_topic_create_edit(request, group_id, app_set_id=None): dict_drawer['2'] = dict2 drawer = dict_drawer['2'] - + # To find themes uniqueness within the context of its parent Theme collection, while editing theme name nodes = node_collection.find({'member_of': {'$all': [theme_item_GST._id]},'group_set':{'$all': [ObjectId(group_id)]}}) for each in nodes: @@ -752,23 +756,23 @@ def theme_topic_create_edit(request, group_id, app_set_id=None): for k in each.collection_set: prior_theme = node_collection.one({'_id': ObjectId(k) }) prior_theme_collection.append(prior_theme.name) - - parent_nodes_collection = json.dumps(prior_theme_collection) + + parent_nodes_collection = json.dumps(prior_theme_collection) # End of finding unique theme names for editing name - + # For adding a sub-themes and maintianing their uniqueness within their context for each in app_GST.collection_set: sub_theme = node_collection.one({'_id': ObjectId(each) }) nodes_list.append(sub_theme.name) - + nodes_list = json.dumps(nodes_list) # End of finding unique sub themes - + # for editing topic elif topic_GST._id in app_GST.member_of: title = topic_GST.name node = app_GST - prior_theme_collection = [] + prior_theme_collection = [] parent_nodes_collection = "" node.get_neighbourhood(node.member_of) @@ -780,7 +784,7 @@ def theme_topic_create_edit(request, group_id, app_set_id=None): for k in each.collection_set: prior_theme = node_collection.one({'_id': ObjectId(k) }) prior_theme_collection.append(prior_theme.name) - + parent_nodes_collection = json.dumps(prior_theme_collection) # End of finding unique theme names for editing name @@ -788,12 +792,12 @@ def theme_topic_create_edit(request, group_id, app_set_id=None): global list_trans_coll list_trans_coll = [] trans_coll_list = get_coll_set(str(app_GST._id)) - print LANGUAGES + print LANGUAGES return render_to_response("ndf/translation_page.html", {'group_id': group_id,'groupid': group_id,'title': title, 'node': app_GST, 'lan':LANGUAGES, 'list1':trans_coll_list },context_instance = RequestContext(request) ) - + if title == "Topic": return render_to_response("ndf/node_edit_base.html", {'group_id': group_id,'groupid': group_id, 'drawer': drawer, 'themes_cards': themes_cards, @@ -804,7 +808,7 @@ def theme_topic_create_edit(request, group_id, app_set_id=None): 'themes_list_items': themes_list_items,'nodes':nodes_dict,'lan':LANGUAGES },context_instance = RequestContext(request) - + ) return render_to_response("ndf/curriculum.html", @@ -816,7 +820,7 @@ def theme_topic_create_edit(request, group_id, app_set_id=None): 'themes_list_items': themes_list_items,'nodes':nodes_dict,'lan':LANGUAGES },context_instance = RequestContext(request) - + ) @@ -824,24 +828,25 @@ def theme_topic_create_edit(request, group_id, app_set_id=None): def get_coll_set(node): obj = node_collection.one({'_id': ObjectId(node)}) #print obj.member_of_names_list - if "Topic" not in obj.member_of_names_list: + if "Topic" not in obj.member_of_names_list: if obj.collection_set: if obj not in list_trans_coll: list_trans_coll.append(obj) for each in obj.collection_set: n = node_collection.one({'_id':each}) - if "Topic" not in n.member_of_names_list: - + if "Topic" not in n.member_of_names_list: + if n not in list_trans_coll: list_trans_coll.append(n) if n.collection_set: - if "Topic" not in n.member_of_names_list: - + if "Topic" not in n.member_of_names_list: + get_coll_set(n._id) return list_trans_coll @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def topic_detail_view(request, group_id, app_Id=None): try: @@ -869,7 +874,7 @@ def topic_detail_view(request, group_id, app_Id=None): for each in nav_l: each_obj = node_collection.one({'_id': ObjectId(each) }) # Theme object needs to be added in breadcrumbs for full navigation path from theme to topic - # "nav_l" doesnt includes theme object since its not in tree hierarchy level, + # "nav_l" doesnt includes theme object since its not in tree hierarchy level, # hence Match the first element and get its prior node which is theme object, to include it in breadcrumbs list # print "!!!!!!!!! ", each_obj.name if each == nav_l[0]: @@ -892,7 +897,7 @@ def topic_detail_view(request, group_id, app_Id=None): #a temp. variable which stores the lookup for append method shelves_append_temp=shelves.append shelf_list = {} - auth = node_collection.one({'_type': 'Author', 'name': unicode(request.user.username) }) + auth = node_collection.one({'_type': 'Author', 'name': unicode(request.user.username) }) if auth: has_shelf_RT = node_collection.one({'_type': 'RelationType', 'name': u'has_shelf' }) @@ -901,7 +906,7 @@ def topic_detail_view(request, group_id, app_Id=None): if shelf: for each in shelf: - shelf_name = node_collection.one({'_id': ObjectId(each.right_subject)}) + shelf_name = node_collection.one({'_id': ObjectId(each.right_subject)}) shelves_append_temp(shelf_name) shelf_list[shelf_name.name] = [] @@ -913,17 +918,17 @@ def topic_detail_view(request, group_id, app_Id=None): else: shelves = [] - + # print "theme_id: ", theme_id - return render_to_response('ndf/topic_details.html', + return render_to_response('ndf/topic_details.html', { 'node': obj,'app_id': app_id,"theme_id": theme_id, "prior_obj": prior_obj, 'group_id': group_id,'shelves': shelves,'topic': topic, 'nav_list':nav_li, - 'groupid':group_id,'shelf_list': shelf_list,'breadcrumbs_list': breadcrumbs_list + 'groupid':group_id,'shelf_list': shelf_list,'breadcrumbs_list': breadcrumbs_list }, context_instance = RequestContext(request) ) - +@cache_control(must_revalidate=True, max_age=6) def get_filtered_topic_resources(request, group_id, node_id): selfilters = request.POST.get('filters', None) @@ -939,7 +944,7 @@ def get_filtered_topic_resources(request, group_id, node_id): 'relation_set.taught_by': 1, '_id': 0 } ) - + node_rel_list = node_rel_cur.relation_set[0].get('taught_by', []) filtered_taught_by_res = node_collection.find({ @@ -985,8 +990,8 @@ def get_filtered_topic_resources(request, group_id, node_id): # return HttpResponse({'primary_lang_resources': primary_lang_resources, 'other_lang_resources': other_lang_resources, 'all_educationaluse': all_educationaluse }) - return render_to_response('ndf/curriculum_resources_listing.html', - { + return render_to_response('ndf/curriculum_resources_listing.html', + { 'primary_lang_resources': primary_lang_resources, 'other_lang_resources': other_lang_resources, 'all_educationaluse': all_educationaluse, # 'node': obj,'app_id': app_id,"theme_id": theme_id, "prior_obj": prior_obj, 'group_id': group_id,'groupid':group_id, @@ -997,9 +1002,8 @@ def get_filtered_topic_resources(request, group_id, node_id): context_instance = RequestContext(request) ) - def get_curriculum_hierarchy(currciculum_obj): - + curriculum_structure = [] if currciculum_obj: for each in currciculum_obj.collection_set: @@ -1009,7 +1013,7 @@ def get_curriculum_hierarchy(currciculum_obj): section_dict['name'] = section.name section_dict['id'] = str(section._id) section_dict['type'] = 'branch' - section_dict['children'] = [] + section_dict['children'] = [] if section.collection_set: for each_section in section.collection_set: subsection_dict ={} @@ -1019,14 +1023,14 @@ def get_curriculum_hierarchy(currciculum_obj): subsection_dict['name'] = subsection.name subsection_dict['type'] = 'division' subsection_dict['id'] = str(subsection._id) - if "Topic" in subsection.member_of_names_list: + if "Topic" in subsection.member_of_names_list: # subsection_dict['children'].append({"name":"Add Division","class":"create_division","type":"division"}) subsection_dict['isLeaf'] = True else: subsection_dict['children'].append({"name":"Add Division","class":"create_division","type":"division"}) - + if subsection.collection_set: - for each_subsection in subsection.collection_set: + for each_subsection in subsection.collection_set: subsection_1_dict = {} subsection_1 = Node.get_node_by_id(each_subsection) if subsection_1: @@ -1034,7 +1038,7 @@ def get_curriculum_hierarchy(currciculum_obj): subsection_1_dict['name'] = subsection_1.name subsection_1_dict['type'] = 'division' subsection_1_dict['id'] = str(subsection_1._id) - if "Topic" in subsection_1.member_of_names_list: + if "Topic" in subsection_1.member_of_names_list: # subsection_1_dict['children'].append({"name":"Add Division","class":"create_division","type":"division"}) subsection_1_dict['isLeaf'] = True else: @@ -1048,7 +1052,6 @@ def get_curriculum_hierarchy(currciculum_obj): curriculum_structure.append({"name":"Add Branch","class":"create_branch"}) return curriculum_structure - @get_execution_time def get_collection_list(collection_list, node): inner_list = [] @@ -1071,8 +1074,8 @@ def get_collection_list(collection_list, node): else: inner_list_append_temp(inner_sub_dict) - cl.update({'children': inner_list }) - else: + cl.update({'children': inner_list }) + else: error_message = "\n TreeHierarchyError: Node with given ObjectId ("+ str(each) +") not found!!!\n" print "\n " + error_message inner_list.append({"name":"Add Division","class":"create_division","type":"division"}) @@ -1080,4 +1083,4 @@ def get_collection_list(collection_list, node): else: print "00000000000000000000000000" - return collection_list \ No newline at end of file + return collection_list diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/custom_app_view.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/custom_app_view.py index 59aa73cff1..901c7d14ed 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/custom_app_view.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/custom_app_view.py @@ -6,6 +6,8 @@ from django.core.urlresolvers import reverse from django.contrib.auth.decorators import login_required +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control import ast @@ -19,6 +21,7 @@ collection = db['Nodes'] @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def custom_app_view(request, group_id, app_name, app_id=None, app_set_id=None, app_set_instance_id=None): """ custom view for custom GAPPS @@ -173,6 +176,7 @@ def custom_app_view(request, group_id, app_name, app_id=None, app_set_id=None, a @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def custom_app_new_view(request, group_id, app_name, app_id, app_set_id=None, app_set_instance_id=None): """ create new instance of app_set of apps view for custom GAPPS @@ -422,5 +426,3 @@ def custom_app_new_view(request, group_id, app_name, app_id, app_set_id=None, ap template = "ndf/custom_template_for_app.html" variable = RequestContext(request, {'groupid':group_id, 'app_name':app_name, 'app_id':app_id, "app_collection_set":app_collection_set, "app_set_id":app_set_id, "nodes":nodes, "systemtype_attributetype_set":systemtype_attributetype_set, "systemtype_relationtype_set":systemtype_relationtype_set, "create_new":"yes", "app_set_name":systemtype_name, 'title':title, 'File':File, 'tags':tags, "content_org":content_org, "system_id":system_id,"system_type":system_type,"mime_type":system_mime_type, "app_set_instance_name":app_set_instance_name, "app_set_instance_id":app_set_instance_id, 'location':location}) return render_to_response(template, variable) - - diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/data_review.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/data_review.py index eff62f55f8..c3c17c6e50 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/data_review.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/data_review.py @@ -7,6 +7,8 @@ from django.shortcuts import render_to_response # , render #uncomment when to use from django.template import RequestContext from django.contrib.auth.decorators import login_required +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control from mongokit import paginator @@ -53,6 +55,7 @@ # data review in File app @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def data_review(request, group_id, page_no=1, **kwargs): ''' To get all the information related to every resource object in the group. @@ -138,6 +141,7 @@ def data_review(request, group_id, page_no=1, **kwargs): # ---END of data review in File app @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_dr_search_result_dict(request, group_id, search_text=None, page_no=1): try: @@ -198,6 +202,7 @@ def get_dr_search_result_dict(request, group_id, search_text=None, page_no=1): # saving resource object of data review @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def data_review_save(request, group_id): ''' Method to save each and every data-row edit of data review app diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/dev_utils.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/dev_utils.py index 9ca8fcd895..b6df8fd446 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/dev_utils.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/dev_utils.py @@ -7,7 +7,8 @@ from django.shortcuts import render_to_response # , render from django.template import RequestContext from django.http import Http404, HttpResponse - +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control try: from bson import ObjectId except ImportError: # old pymongo @@ -16,7 +17,7 @@ ''' -- imports from application folders/files -- ''' from gnowsys_ndf.ndf.models import node_collection, triple_collection, gridfs_collection, NodeJSONEncoder - +@cache_control(must_revalidate=True, max_age=6) def query_doc(request, doc_id_or_name=None, option=None): if ObjectId.is_valid(doc_id_or_name): @@ -40,7 +41,7 @@ def query_doc(request, doc_id_or_name=None, option=None): context_instance=RequestContext(request) ) - +@cache_control(must_revalidate=True, max_age=6) def render_test_template(request): test_node = node_collection.one({"name":"home", '_type':"Group"}) return render_to_response( @@ -49,15 +50,13 @@ def render_test_template(request): context_instance=RequestContext(request) ) - +@cache_control(must_revalidate=True, max_age=6) def git_branch(request): return HttpResponse(subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']), content_type="text/plain") - +@cache_control(must_revalidate=True, max_age=6) def git_misc(request, git_command): response = "Unsupported" if git_command in ['log', 'branch', 'status', 'tag', 'show', 'diff']: response = subprocess.check_output(['git', git_command]) return HttpResponse(response, content_type="text/plain") - - diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/discussion.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/discussion.py index 98cbc068e9..3e8583cdd6 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/discussion.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/discussion.py @@ -9,6 +9,8 @@ from django.http import HttpResponse from django.core.serializers.json import DjangoJSONEncoder from django.core.cache import cache +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control from mongokit import paginator import mongokit @@ -62,6 +64,7 @@ @login_required @get_execution_time @auto_enroll +@cache_control(must_revalidate=True, max_age=6) def create_discussion(request, group_id, node_id): ''' Method to create discussion thread for File and Page. @@ -139,6 +142,7 @@ def create_discussion(request, group_id, node_id): @get_execution_time @login_required @auto_enroll +@cache_control(must_revalidate=True, max_age=6) def discussion_reply(request, group_id, node_id): try: group_id = ObjectId(group_id) @@ -387,6 +391,7 @@ def discussion_reply(request, group_id, node_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def discussion_delete_reply(request, group_id, node_id): try: @@ -420,6 +425,7 @@ def discussion_delete_reply(request, group_id, node_id): @login_required @auto_enroll @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def edit_comment(request, group_id, node_id=None,call_from_discussion=None): try: @@ -453,12 +459,14 @@ def edit_comment(request, group_id, node_id=None,call_from_discussion=None): return render_to_response(template, context_variables, context_instance = RequestContext(request)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_thread_comments_count(request, group_id, thread_node_id): return HttpResponse(node_collection.find({'group_set': ObjectId(group_id), 'member_of': reply_st._id, 'origin' : { '$elemMatch' : {'thread_id':ObjectId(thread_node_id)}}}).count()) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_user_replies(request, group_id, user_name_or_id): group_obj = get_group_name_id(group_id, get_obj=True) @@ -482,4 +490,4 @@ def get_user_replies(request, group_id, user_name_or_id): }, context_instance=RequestContext(request)) except Exception as no_user: - return HttpResponse('No such User found') \ No newline at end of file + return HttpResponse('No such User found') diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/e-book.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/e-book.py index 40250ed42e..757303cfb7 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/e-book.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/e-book.py @@ -1,10 +1,12 @@ import json -''' -- imports from installed packages -- ''' +''' -- imports from installed packages -- ''' from django.shortcuts import render_to_response from django.template import RequestContext # from django.core.urlresolvers import reverse from mongokit import paginator +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control try: @@ -26,13 +28,14 @@ GST_PAGE = node_collection.one({'_type':'GSystemType', 'name': u'Page'}) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def ebook_listing(request, group_id, page_no=1): from gnowsys_ndf.settings import GSTUDIO_NO_OF_OBJS_PP import urllib try: - group_id = ObjectId(group_id) - except: + group_id = ObjectId(group_id) + except: group_name, group_id = get_group_name_id(group_id) selfilters = urllib.unquote(request.GET.get('selfilters', '')) @@ -43,7 +46,7 @@ def ebook_listing(request, group_id, page_no=1): query_dict = get_filter_querydict(selfilters) # else: # query_dict.append({'collection_set': {'$exists': "true", '$not': {'$size': 0} }}) - + # print "\n----\n", query_dict # all_ebooks = node_collection.find({ # # "_type": "File", @@ -52,17 +55,17 @@ def ebook_listing(request, group_id, page_no=1): # 'collection_set': {'$exists': "true", '$not': {'$size': 0} } # }) - all_ebooks = node_collection.find({ + all_ebooks = node_collection.find({ 'member_of': {'$in': [GST_FILE._id, GST_PAGE._id]}, # '_type': 'File', - # 'fs_file_ids': {'$ne': []}, + # 'fs_file_ids': {'$ne': []}, 'group_set': {'$in': [ObjectId(group_id)]}, 'attribute_set.educationaluse': 'eBooks', '$and': query_dict, '$or': [ { 'access_policy': u"PUBLIC" }, { '$and': [ - {'access_policy': u"PRIVATE"}, + {'access_policy': u"PRIVATE"}, {'created_by': request.user.id} ] } diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/e-library.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/e-library.py index ee9c332c39..631af02e13 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/e-library.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/e-library.py @@ -6,6 +6,8 @@ from django.template import RequestContext from mongokit import paginator +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control try: from bson import ObjectId @@ -36,6 +38,7 @@ ############################################################################## @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def resource_list(request, group_id, app_id=None, page_no=1): """ * Renders a list of all 'Resources' available within the database (except eBooks). @@ -166,7 +169,7 @@ def resource_list(request, group_id, app_id=None, page_no=1): elif len(set(eu_list)) == 1: educationaluse_stats = { eu_list[0]: eu_list.count(eu_list[0])} educationaluse_stats["all"] = files.count() - + # print educationaluse_stats result_paginated_cur = files @@ -224,6 +227,7 @@ def resource_list(request, group_id, app_id=None, page_no=1): context_instance = RequestContext(request)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def elib_paged_file_objs(request, group_id, filetype, page_no): ''' Method to implement pagination in File and E-Library app. @@ -324,7 +328,7 @@ def elib_paged_file_objs(request, group_id, filetype, page_no): # print "query_dict : ", query_dict - + files = node_collection.find({ 'member_of': {'$in': [GST_FILE._id,GST_JSMOL._id]}, # 'member_of': {'$in': [GST_FILE._id, GST_PAGE._id]}, diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/email_registration.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/email_registration.py index 5f66d4b0c0..3e3e759b6f 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/email_registration.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/email_registration.py @@ -9,6 +9,8 @@ from django.contrib.auth.forms import PasswordResetForm from django.core.urlresolvers import reverse from django.template.response import TemplateResponse +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control from registration_email.forms import EmailRegistrationForm @@ -29,7 +31,6 @@ def generate_username(username): return username - class GstudioEmailRegistrationForm(EmailRegistrationForm): """ Subclassing: class EmailRegistrationForm(forms.Form) from registration_email.forms file. @@ -87,6 +88,7 @@ def clean(self): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def password_reset_email(request, *args, **kwargs): if request.method == "POST": eml=request.POST.get('email',None) @@ -98,6 +100,7 @@ def password_reset_email(request, *args, **kwargs): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def password_reset_error(request,*args,**kwargs): if request.method == "POST": eml=request.POST.get('email',None) @@ -113,4 +116,4 @@ def password_reset_error(request,*args,**kwargs): template_name="registration/password_reset_error_form.html" context={ 'form':form,} - return TemplateResponse(request, template_name, context) \ No newline at end of file + return TemplateResponse(request, template_name, context) diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/enrollment.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/enrollment.py index f4b82c3b5e..743935c664 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/enrollment.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/enrollment.py @@ -17,6 +17,8 @@ from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required from django.contrib.sites.models import Site +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control from mongokit import IS # Don't delete used indirectly inside eval() @@ -41,6 +43,7 @@ @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def enrollment_create_edit(request, group_id, app_id, app_set_id=None, app_set_instance_id=None, app_name=None): """ Creates/Modifies document of given sub-types of Course(s). @@ -863,6 +866,7 @@ def enrollment_create_edit(request, group_id, app_id, app_set_id=None, app_set_i @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def enrollment_detail(request, group_id, app_id, app_set_id=None, app_set_instance_id=None, app_name=None): """ custom view for custom GAPPS @@ -889,7 +893,7 @@ def enrollment_detail(request, group_id, app_id, app_set_id=None, app_set_instan else: app = node_collection.one({'_id': ObjectId(app_id)}) - app_name = app.name + app_name = app.name # app_name = "mis" app_set = "" @@ -916,7 +920,7 @@ def enrollment_detail(request, group_id, app_id, app_set_id=None, app_set_instan agency_type_node = node_collection.one({'_type': "GSystemType", 'name': agency_type}, {'collection_set': 1}) if agency_type_node: for eachset in agency_type_node.collection_set: - app_collection_set.append(node_collection.one({"_id": eachset}, {'_id': 1, 'name': 1, 'type_of': 1})) + app_collection_set.append(node_collection.one({"_id": eachset}, {'_id': 1, 'name': 1, 'type_of': 1})) if app_set_id: sce_gst = node_collection.one({'_type': "GSystemType", '_id': ObjectId(app_set_id)})#, {'name': 1, 'type_of': 1}) @@ -998,7 +1002,7 @@ def enrollment_detail(request, group_id, app_id, app_set_id=None, app_set_instan if attr and 'nussd_course_type' in attr: each['for_course'] = attr['nussd_course_type'] break - + ac_data_set.append(each) @@ -1043,8 +1047,8 @@ def enrollment_detail(request, group_id, app_id, app_set_id=None, app_set_instan property_order_list = get_property_order_with_value(node) node.get_neighbourhood(node.member_of) - context_variables = { 'groupid': group_id, - 'app_id': app_id, 'app_name': app_name, 'app_collection_set': app_collection_set, + context_variables = { 'groupid': group_id, + 'app_id': app_id, 'app_name': app_name, 'app_collection_set': app_collection_set, 'app_set_id': app_set_id, 'title': title, 'nodes': nodes, "nodes_keys": nodes_keys, 'node': node, @@ -1053,21 +1057,22 @@ def enrollment_detail(request, group_id, app_id, app_set_id=None, app_set_instan 'response_dict':json.dumps(response_dict, cls=NodeJSONEncoder) } try: - return render_to_response([template, default_template], + return render_to_response([template, default_template], context_variables, context_instance = RequestContext(request) ) - + except TemplateDoesNotExist as tde: error_message = "\n StudentCourseEnrollmentDetailListViewError: This html template (" + str(tde) + ") does not exists !!!\n" raise Http404(error_message) - + except Exception as e: error_message = "\n StudentCourseEnrollmentDetailListViewError: " + str(e) + " !!!\n" raise Exception(error_message) @login_required +@cache_control(must_revalidate=True, max_age=6) def enrollment_enroll(request, group_id, app_id, app_set_id=None, app_set_instance_id=None, app_name=None): """ Student enrollment diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/event.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/event.py index 6875cfc85d..cf0c68d5e7 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/event.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/event.py @@ -15,6 +15,8 @@ from django.contrib.sites.models import Site from django.contrib.auth.decorators import login_required from django.template.defaultfilters import slugify +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control try: from bson import ObjectId @@ -37,8 +39,9 @@ @get_execution_time @login_required +@cache_control(must_revalidate=True, max_age=6) def event(request, group_id): - + if ObjectId.is_valid(group_id) is False : group_ins = node_collection.one({'_type': "Group","name": group_id}) auth = node_collection.one({'_type': 'Author', 'name': unicode(request.user.username) }) @@ -52,7 +55,7 @@ def event(request, group_id): pass #view written just to show the landing page of the events - group_inverse_rel_id = [] + group_inverse_rel_id = [] Event_app = True Group_type=node_collection.one({'_id':ObjectId(group_id)}) for i in Group_type.relation_set: @@ -63,16 +66,16 @@ def event(request, group_id): if Group_name: if (any( unicode('has_group') in d for d in Group_name.relation_set)) == True: - Eventtype='CollegeEvents' + Eventtype='CollegeEvents' else: Eventtype='Eventtype' - + Glisttype=node_collection.find({"_type": "GSystemType", "name":"GList"}) #bug #Event_Types = node_collection.one({"member_of":ObjectId(Glisttype[0]["_id"]),"name":"Eventtype"},{'collection_set': 1}) #buggy Event_Types = node_collection.one({"member_of":ObjectId(Glisttype[0]["_id"]),"name":unicode(Eventtype)},{'collection_set': 1}) - + app_collection_set=[] Mis_admin_list=[] #check for the mis group Admin @@ -84,15 +87,15 @@ def event(request, group_id): Mis_admin_list=Mis_admin.group_admin Mis_admin_list.append(Mis_admin.created_by) if request.user.id in Mis_admin_list: - Add="Allow" - else: + Add="Allow" + else: Add= "Stop" else: - Add="Stop" + Add="Stop" if Event_Types: for eachset in Event_Types.collection_set: - app_collection_set.append(node_collection.one({"_id": eachset}, {'_id': 1, 'name': 1, 'type_of': 1})) + app_collection_set.append(node_collection.one({"_id": eachset}, {'_id': 1, 'name': 1, 'type_of': 1})) return render_to_response('ndf/event.html',{'app_collection_set':app_collection_set, 'groupid':group_id, 'group_id':group_id, @@ -105,6 +108,7 @@ def event(request, group_id): @get_execution_time @login_required +@cache_control(must_revalidate=True, max_age=6) def event_detail(request, group_id, app_id=None, app_set_id=None, app_set_instance_id=None): """ View for handling Event and it's sub-types detail-view @@ -124,14 +128,14 @@ def event_detail(request, group_id, app_id=None, app_set_id=None, app_set_instan app_id = str(app._id) else:''' app = node_collection.one({'_id': ObjectId(app_id)}) - - #app_name = app.name + + #app_name = app.name app_set = "" app_collection_set = [] title = "" marks_enter= "" - session_node = "" + session_node = "" event_gst = None event_gs = None reschedule = True @@ -140,7 +144,7 @@ def event_detail(request, group_id, app_id=None, app_set_id=None, app_set_instan event_task_Attendance_reschedule = "" marks="" property_order_list = [] - + #template_prefix = "mis" if request.user: @@ -149,7 +153,7 @@ def event_detail(request, group_id, app_id=None, app_set_id=None, app_set_instan Event_Types = node_collection.one({'_type': "GSystemType", 'name': agency_type}, {'collection_set': 1}) if Event_Types: for eachset in Event_Types.collection_set: - app_collection_set.append(node_collection.one({"_id": eachset}, {'_id': 1, 'name': 1, 'type_of': 1})) + app_collection_set.append(node_collection.one({"_id": eachset}, {'_id': 1, 'name': 1, 'type_of': 1})) ''' # for eachset in app.collection_set: # app_collection_set.append(node_collection.one({"_id":eachset}, {'_id': 1, 'name': 1, 'type_of': 1})) @@ -158,13 +162,13 @@ def event_detail(request, group_id, app_id=None, app_set_id=None, app_set_instan for i in Group_type.relation_set: if unicode("group_of") in i.keys(): group_inverse_rel_id = i['group_of'] - + Group_name = node_collection.one({'_type':'GSystem','_id':{'$in':group_inverse_rel_id}}) Eventtype='Eventtype' if Group_name: if (any( unicode('has_group') in d for d in Group_name.relation_set)) == True: - Eventtype='CollegeEvents' + Eventtype='CollegeEvents' else: Eventtype='Eventtype' @@ -173,14 +177,14 @@ def event_detail(request, group_id, app_id=None, app_set_id=None, app_set_instan app_collection_set=[] if Event_Types: for eachset in Event_Types.collection_set: - app_collection_set.append(node_collection.one({"_id": eachset}, {'_id': 1, 'name': 1, 'type_of': 1})) + app_collection_set.append(node_collection.one({"_id": eachset}, {'_id': 1, 'name': 1, 'type_of': 1})) + - nodes = None if app_set_id: event_gst = node_collection.one({'_type': "GSystemType", '_id': ObjectId(app_set_id)}, {'name': 1, 'type_of': 1}) title = event_gst.name - + template = "ndf/event_list.html" if request.method=="POST": @@ -190,7 +194,7 @@ def event_detail(request, group_id, app_id=None, app_set_id=None, app_set_instan nodes = node_collection.find({'member_of': event_gst._id, 'name': {'$regex': search, '$options': 'i'}}) else: nodes = node_collection.find({'member_of': event_gst._id, 'group_set': ObjectId(group_id)}).sort('last_update', -1) - + node = None marks_entry_completed = True marks_list=[] @@ -203,34 +207,34 @@ def event_detail(request, group_id, app_id=None, app_set_id=None, app_set_instan node = node_collection.one({'_type': "GSystem", '_id': ObjectId(app_set_instance_id)}) # property_order_list = get_property_order_with_value(node) # print "\n property_order_list: ", property_order_list, "\n" - + node.get_neighbourhood(node.member_of) course=[] val=False - + for i in node.attribute_set: if unicode('event_edit_reschedule') in i.keys(): - try: + try: if (unicode('reschedule_till') in i['event_edit_reschedule']) == True: - reschedule_time = i['event_edit_reschedule']['reschedule_till'] - if (unicode('reschedule_allow') in i['event_edit_reschedule']): + reschedule_time = i['event_edit_reschedule']['reschedule_till'] + if (unicode('reschedule_allow') in i['event_edit_reschedule']): reschedule = i['event_edit_reschedule']['reschedule_allow'] except: pass if (unicode('event_attendance_task')) in i.keys(): event_task_Attendance_reschedule = i['event_attendance_task']['Reschedule_Task'] - + if(unicode('event_date_task')) in i.keys(): - event_task_date_reschedule = i['event_date_task']['Reschedule_Task'] - if(unicode('marks_entry_completed')) in i.keys(): - marks_entry_completed = i['marks_entry_completed'] - + event_task_date_reschedule = i['event_date_task']['Reschedule_Task'] + if(unicode('marks_entry_completed')) in i.keys(): + marks_entry_completed = i['marks_entry_completed'] + for i in node.relation_set: if unicode('event_has_batch') in i.keys(): batch=node_collection.one({'_type':"GSystem",'_id':ObjectId(i['event_has_batch'][0])}) batch_relation=node_collection.one({'_type':"GSystem",'_id':ObjectId(batch._id)},{'relation_set':1}) for i in batch_relation['relation_set']: - if unicode('has_course') in i.keys(): + if unicode('has_course') in i.keys(): announced_course =node_collection.one({"_type":"GSystem",'_id':ObjectId(i['has_course'][0])}) for i in announced_course.relation_set: if unicode('announced_for') in i.keys(): @@ -240,7 +244,7 @@ def event_detail(request, group_id, app_id=None, app_set_id=None, app_set_instan event_has_session = node_collection.one({'_type':"GSystem",'_id':ObjectId(i['session_of'][0])}) session_node = node_collection.one({'_id':ObjectId(event_has_session._id)},{'attribute_set':1}) - + # print "\n node.keys(): ", node.keys(), "\n" # default_template = "ndf/"+template_prefix+"_create_edit.html" Mis_admin=node_collection.one({"_type":"Group","name":"MIS_admin"}) @@ -248,26 +252,26 @@ def event_detail(request, group_id, app_id=None, app_set_id=None, app_set_instan Mis_admin_list=Mis_admin.group_admin Mis_admin_list.append(Mis_admin.created_by) if request.user.id in Mis_admin_list: - Add = "Allow" - else: + Add = "Allow" + else: Add = "Stop" else: - Add="Stop" + Add="Stop" #fecth the data can_access_val = Group.can_access(request.user.id, group_obj) - context_variables = { 'groupid': group_id, 'group_id': group_id, - 'app_id': app_id,'app_collection_set': app_collection_set, + context_variables = { 'groupid': group_id, 'group_id': group_id, + 'app_id': app_id,'app_collection_set': app_collection_set, 'app_set_id': app_set_id, 'title':title, 'nodes': nodes, 'node': node, 'event_gst':event_gst.name, 'Add':Add, 'reschedule_time' : reschedule_time, - 'reschedule' : reschedule, + 'reschedule' : reschedule, 'task_date' : event_task_date_reschedule, 'task_attendance' : event_task_Attendance_reschedule, 'marks_entry_completed' :marks_entry_completed, - 'Eventtype':Eventtype, + 'Eventtype':Eventtype, # 'property_order_list': property_order_list } @@ -275,7 +279,7 @@ def event_detail(request, group_id, app_id=None, app_set_id=None, app_set_instan if request.user.id: usr = node_collection.one({'_type':u'Author','name':unicode(request.user.username)}) usrid = usr._id - + bbb = False open_event = False @@ -288,10 +292,10 @@ def event_detail(request, group_id, app_id=None, app_set_id=None, app_set_instan elif unicode('is_bigbluebutton') in i.keys(): bbb = i['is_bigbluebutton'] elif unicode('open_event') in i.keys(): - open_event = i['open_event'] + open_event = i['open_event'] # st_time = node.attribute_set[0]['start_time'] # end_time = node.attribute_set[1]['end_time'] - + now = datetime.datetime.now() beg = start_time @@ -302,21 +306,21 @@ def event_detail(request, group_id, app_id=None, app_set_id=None, app_set_instan if now <= end and beg <= now : active = 0 - elif now > end : + elif now > end : active = 1 else: - active = -1 + active = -1 days_left = (start_time-now).days hours_left = (start_time-now).seconds//3600 if hours_left == 0: - shortly = True + shortly = True is_attendee = False - is_moderator = False + is_moderator = False attendee_list = [] - moderator_list = [] + moderator_list = [] if open_event and can_access_val: is_attendee = True @@ -332,21 +336,21 @@ def event_detail(request, group_id, app_id=None, app_set_id=None, app_set_instan is_attendee = True is_moderator = True - if not is_moderator: + if not is_moderator: for i in attendee_list: if usrid == i: is_attendee = True - break + break - url = "" + url = "" - if active == 0: + if active == 0: createMeeting(node.name, node._id, 'welcome', 'mPW', 'aPW', SALT , URL, 'logout.html') - + if is_moderator: url = joinURL(node._id, request.user, 'mPW', SALT, URL) else: - url = joinURL(node._id, request.user, 'aPW', SALT, URL) + url = joinURL(node._id, request.user, 'aPW', SALT, URL) extra_context_variables = {'show':is_attendee, 'url':url, @@ -354,22 +358,22 @@ def event_detail(request, group_id, app_id=None, app_set_id=None, app_set_instan 'days_left':days_left, 'is_bbb': bbb, 'shortly':shortly, - 'hours_left':hours_left, + 'hours_left':hours_left, 'open_event':open_event, } context_variables.update(extra_context_variables) - + if batch : - context_variables.update({'batch':batch}) + context_variables.update({'batch':batch}) if course: context_variables.update({'course':course}) - else : - context_variables.update({'Assesslist':Assesslist}) + else : + context_variables.update({'Assesslist':Assesslist}) # print "\n template-list: ", [template, default_template] # template = "ndf/fgh.html" # default_template = "ndf/dsfjhk.html" - # return render_to_response([template, default_template], + # return render_to_response([template, default_template], if session_node: session_min_marks = "" @@ -380,17 +384,18 @@ def event_detail(request, group_id, app_id=None, app_set_id=None, app_set_instan elif attr and u"max_marks" in attr: session_max_marks = attr[u"max_marks"] context_variables.update({'session_min_marks':session_min_marks}) - context_variables.update({'session_max_marks':session_max_marks}) + context_variables.update({'session_max_marks':session_max_marks}) - return render_to_response(template, + return render_to_response(template, context_variables, context_instance = RequestContext(request) ) - - - + + + @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def event_create_edit(request, group_id, app_set_id=None, app_set_instance_id=None): """ View for handling Event and it's sub-types create-edit-view @@ -416,7 +421,7 @@ def event_create_edit(request, group_id, app_set_id=None, app_set_instance_id=No template_prefix = "mis" - group_inverse_rel_id = [] + group_inverse_rel_id = [] Group_type=node_collection.one({'_id':ObjectId(group_id)}) #instance of the group object in which the event is created e.g. "home" is a group for i in Group_type.relation_set: if unicode("group_of") in i.keys(): @@ -427,7 +432,7 @@ def event_create_edit(request, group_id, app_set_id=None, app_set_instance_id=No if Group_name: if (any( unicode('has_group') in d for d in Group_name.relation_set)) == True: - Eventtype='CollegeEvents' + Eventtype='CollegeEvents' else: Eventtype='Eventtype' @@ -436,12 +441,12 @@ def event_create_edit(request, group_id, app_set_id=None, app_set_instance_id=No app_collection_set=[] #stores the id, name and type_of for all event types (Meeting, Inauguration, etc.) as a list if Event_Types: for eachset in Event_Types.collection_set: - app_collection_set.append(node_collection.one({"_id": eachset}, {'_id': 1, 'name': 1, 'type_of': 1})) + app_collection_set.append(node_collection.one({"_id": eachset}, {'_id': 1, 'name': 1, 'type_of': 1})) iteration=request.POST.get("iteration","") if iteration == "": iteration=1 - + for i in range(int(iteration)): if app_set_id: event_gst = node_collection.one({'_type': "GSystemType", '_id': ObjectId(app_set_id)}, {'name': 1, 'type_of': 1}) #GSystemType Object for the event corresponding to app_set_id e.g. Meeting @@ -452,7 +457,7 @@ def event_create_edit(request, group_id, app_set_id=None, app_set_instance_id=No if app_set_instance_id: #app_set_instance_id is the objectid of the event object which is already created event_gs = node_collection.one({'_type': "GSystem", '_id': ObjectId(app_set_instance_id)}) property_order_list = get_property_order_with_value(event_gs) #.property_order #stores the properties defining a particular event in a list e.g. name, start_time, attendees, etc.. - + if request.method == "POST": # [A] Save event-node's base-field(s) # print "\n Going before....", type(event_gs), "\n event_gs.keys(): ", event_gs.keys() @@ -467,23 +472,23 @@ def event_create_edit(request, group_id, app_set_id=None, app_set_instance_id=No event_gs.status = u"PUBLISHED" if (request.POST.get("name","")) == "": if i>0: - field_value=request.POST.get('start_time'+"_"+str(i),'') + field_value=request.POST.get('start_time'+"_"+str(i),'') else: field_value = request.POST.get('start_time','') # print "----------------Field Value-----------" # print field_value if event_gst.name == "Exam": - name = "Exam" + "--" + slugify(request.POST.get("batch_name","")) + "--" + field_value + name = "Exam" + "--" + slugify(request.POST.get("batch_name","")) + "--" + field_value else: name= "Class" + "--"+ slugify(request.POST.get("course_name","")) + "--" + field_value # print "-----------------Name------------------" # print name - event_gs.name=name + event_gs.name=name # if request.POST.get("is_bigbluebutton") == unicode("Yes"): # event_gs.is_bigbluebutton = True # else: - # event_gs.is_bigbluebutton = False + # event_gs.is_bigbluebutton = False event_gs.save(is_changed=is_changed,groupid=group_id) # print "\n Event: ", event_gs._id, " -- ", event_gs.name, "\n" @@ -496,13 +501,13 @@ def event_create_edit(request, group_id, app_set_id=None, app_set_instance_id=No # print " ", field_set["name"] # * Fetch only Attribute field(s) / Relation field(s) - + if field_set.has_key('_id'): #Implies field_set is not a basefield but is an AT/RT field_instance = node_collection.one({'_id': field_set['_id']})#field_instance is an instance for AT or RT e.g. start_time field_instance_type = type(field_instance) if field_instance_type in [AttributeType, RelationType]: - + if field_instance["name"] == "attendees": continue @@ -513,13 +518,13 @@ def event_create_edit(request, group_id, app_set_id=None, app_set_instance_id=No if field_instance_type == AttributeType: if "File" in field_instance["validators"]: # Special case: AttributeTypes that require file instance as it's value in which case file document's ObjectId is used - + if field_instance["name"] in request.FILES: field_value = request.FILES[field_instance["name"]] - + else: field_value = "" - + # Below 0th index is used because that function returns tuple(ObjectId, bool-value) if field_value != '' and field_value != u'': file_name = event_gs.name + " -- " + field_instance["altnames"] @@ -529,12 +534,12 @@ def event_create_edit(request, group_id, app_set_id=None, app_set_instance_id=No if "date_month_day_year" in field_instance["validators"]: if i>0: - field_value=request.POST.get(field_instance["name"]+"_"+str(i)) + field_value=request.POST.get(field_instance["name"]+"_"+str(i)) else: field_value = request.POST[field_instance["name"]] - + else: - # Other AttributeTypes + # Other AttributeTypes field_value = request.POST[field_instance["name"]] # field_instance_type = "GAttribute" # print "\n Parsing data for: ", field_instance["name"] @@ -544,7 +549,7 @@ def event_create_edit(request, group_id, app_set_id=None, app_set_instance_id=No field_value = parse_template_data(field_data_type, field_value, date_format_string="%d/%m/%Y") else: field_value = parse_template_data(field_data_type, field_value, date_format_string="%d/%m/%Y %H:%M") - + if field_value: event_gs_triple_instance = create_gattribute(event_gs._id, node_collection.collection.AttributeType(field_instance), field_value) # print "--------------------------------------------------------------------------------------------------" @@ -556,7 +561,7 @@ def event_create_edit(request, group_id, app_set_id=None, app_set_instance_id=No else: #field_instance_type == RelationType field_value_list = request.POST.getlist(field_instance["name"]) # field_instance_type = "GRelation" - #code for creation of relation Session of + #code for creation of relation Session of for i, field_value in enumerate(field_value_list): try: field_value = parse_template_data(field_data_type, field_value, field_instance=field_instance, date_format_string="%d/%m/%Y %H:%M") @@ -576,7 +581,7 @@ def event_create_edit(request, group_id, app_set_id=None, app_set_instance_id=No if i==( (int(iteration))-1): #code to send mail to every one return HttpResponseRedirect(reverse('event_app_instance_detail', kwargs={'group_id': group_id,"app_set_id":app_set_id,"app_set_instance_id":event_gs._id})) - + else: event_attendees = [] event_node = node_collection.one({'_id':ObjectId(event_gs._id)}) @@ -587,7 +592,7 @@ def event_create_edit(request, group_id, app_set_id=None, app_set_instance_id=No return HttpResponseRedirect(reverse('event_app_instance_detail', kwargs={'group_id': group_id,"app_set_id":app_set_id,"app_set_instance_id":event_node._id})) event_attendees = request.POST.getlist('has_attendees','') - + event_gs.get_neighbourhood(event_gs.member_of) course=[] val=False @@ -596,13 +601,13 @@ def event_create_edit(request, group_id, app_set_id=None, app_set_instance_id=No batch=node_collection.one({'_type':"GSystem",'_id':ObjectId(i['event_has_batch'][0])}) batch_relation=node_collection.one({'_type':"GSystem",'_id':ObjectId(batch._id)},{'relation_set':1}) for i in batch_relation['relation_set']: - if unicode('has_course') in i.keys(): + if unicode('has_course') in i.keys(): announced_course =node_collection.one({"_type":"GSystem",'_id':ObjectId(i['has_course'][0])}) for i in announced_course.relation_set: if unicode('announced_for') in i.keys(): course=node_collection.one({"_type":"GSystem",'_id':ObjectId(i['announced_for'][0])}) - if unicode('session_of') in i.keys(): - session_of=node_collection.one({'_type':"GSystem",'_id':ObjectId(i['session_of'][0])}) + if unicode('session_of') in i.keys(): + session_of=node_collection.one({'_type':"GSystem",'_id':ObjectId(i['session_of'][0])}) module=node_collection.one({'_type':"GSystem",'_id':{'$in':session_of.prior_node}}) event_gs.event_coordinator Mis_admin=node_collection.one({"_type":"Group","name":"MIS_admin"}) @@ -610,20 +615,20 @@ def event_create_edit(request, group_id, app_set_id=None, app_set_instance_id=No Mis_admin_list=Mis_admin.group_admin Mis_admin_list.append(Mis_admin.created_by) if request.user.id in Mis_admin_list: - Add="Allow" - else: + Add="Allow" + else: Add= "Stop" else: - Add="Stop" + Add="Stop" + - if event_gst.name == u'Classroom Session' or event_gst.name == u'Exam': template="ndf/Nussd_event_Schedule.html" else: template = "ndf/event_create_edit.html" # default_template = "ndf/"+template_prefix+"_create_edit.html" - context_variables = { 'group_id': group_id, 'groupid': group_id, - 'app_collection_set': app_collection_set, + context_variables = { 'group_id': group_id, 'groupid': group_id, + 'app_collection_set': app_collection_set, 'app_set_id': app_set_id, 'title':title, 'property_order_list': property_order_list, @@ -634,15 +639,15 @@ def event_create_edit(request, group_id, app_set_id=None, app_set_instance_id=No event_detail={} events={} if event_gs.event_coordinator: - event_detail["cordinatorname"]=str(event_gs.event_coordinator[0].name) + event_detail["cordinatorname"]=str(event_gs.event_coordinator[0].name) event_detail["cordinatorid"]=str(event_gs.event_coordinator[0]._id) events["cordinator"]=event_detail if announced_course: - event_detail["course"]=str(announced_course.name) + event_detail["course"]=str(announced_course.name) event_detail["course_id"]=str(announced_course._id) events["course"]=event_detail event_detail={} - if batch: + if batch: event_detail["batchname"]=str(batch.name) event_detail["batchid"]=str(batch._id) events["batch"]=event_detail @@ -653,7 +658,7 @@ def event_create_edit(request, group_id, app_set_id=None, app_set_instance_id=No for i in session_of.attribute_set: if unicode('course_structure_minutes') in i.keys(): event_detail["sessionminutes"] = str(i['course_structure_minutes']) - + events["session"]=event_detail event_detail={} if module: @@ -662,17 +667,16 @@ def event_create_edit(request, group_id, app_set_id=None, app_set_instance_id=No events["Module"]=event_detail context_variables['node'] = event_gs context_variables['edit_details']=events - + # print "\n template-list: ", [template, default_template] # template = "ndf/fgh.html" # default_template = "ndf/dsfjhk.html" - # return render_to_response([template, default_template], + # return render_to_response([template, default_template], - return render_to_response(template, + return render_to_response(template, context_variables, context_instance = RequestContext(request) ) - def send_event_notif_to_all_grp_members(group_obj, app_set_id, event_node, user_list): group_id = group_obj._id to_user_list = [] @@ -687,7 +691,7 @@ def send_event_notif_to_all_grp_members(group_obj, app_set_id, event_node, user_ if unicode('has_attendees') in i.keys(): event_attendees = i['has_attendees'] if unicode('event_coordinator') in i.keys(): - event_coordinator = i['event_coordinator'] + event_coordinator = i['event_coordinator'] try: event_url = "/"+str(group_id)+"/event/"+str(app_set_id) +"/"+str(event_node._id) site = Site.objects.get(pk=1) @@ -698,7 +702,7 @@ def send_event_notif_to_all_grp_members(group_obj, app_set_id, event_node, user_ for i in event_coordinator_cur: event_coordinator_str = event_coordinator_str + i.name + " " for i in event_organized_by_cur: - event_organizer_str = event_coordinator_str + i.name + " " + event_organizer_str = event_coordinator_str + i.name + " " render_label = render_to_string( "notification/label.html", { @@ -717,11 +721,11 @@ def send_event_notif_to_all_grp_members(group_obj, app_set_id, event_node, user_ user_obj = User.objects.get(id=each_member) if user_obj not in to_user_list: to_user_list.append(user_obj) - + if event_organized_by: - msg_string = "\n Event is organized by " + str ( event_organizer_str ) + msg_string = "\n Event is organized by " + str ( event_organizer_str ) else: - msg_string = "" + msg_string = "" message_string = "Invitation for Event"+ " " + str(event_node.name) + msg_string + "\n Event will be co-ordinated by " +str (event_coordinator_str) + "\n- Please click [[" + event_link + "][here]] to view the details of the event" notification.create_notice_type(render_label, message_string, "notification") ##This is sent via email to all attendees in the group diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/explore.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/explore.py index bc5d2c0e0c..05f8185666 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/explore.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/explore.py @@ -15,6 +15,8 @@ # from django.contrib.sites.models import Site # from mongokit import IS from mongokit import paginator +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control try: from bson import ObjectId @@ -44,6 +46,7 @@ at_items_sort_list = node_collection.one({'_type': "AttributeType", 'name': "items_sort_list"}) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def explore(request): return HttpResponseRedirect(reverse('explore_courses', kwargs={})) @@ -60,6 +63,7 @@ def explore(request): Depricated as on 15 Apr 2017 - katkamrachana For new explore UI to list Modules and announced-units @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def explore_courses(request,page_no=1): # this will be announced tab title = 'courses' @@ -104,6 +108,7 @@ def explore_courses(request,page_no=1): ''' @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def explore_groups(request,page_no=1): title = 'workspaces' gstaff_access = check_is_gstaff(group_id,request.user) @@ -140,6 +145,7 @@ def explore_groups(request,page_no=1): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def explore_basecourses(request,page_no=1): title = 'courses' @@ -228,7 +234,7 @@ def explore_courses(request): # this will be announced tab title = 'courses' context_variable = { - 'title': title, + 'title': title, 'group_id': group_id, 'groupid': group_id, 'modules_is_cur': True, } @@ -321,12 +327,13 @@ def explore_courses(request): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def explore_drafts(request): title = 'drafts' modules_sort_list = None modules_sort_list = get_attribute_value(group_id, 'items_sort_list') context_variable = { - 'title': title, + 'title': title, 'group_id': group_id, 'groupid': group_id, 'modules_is_cur': True } @@ -389,11 +396,12 @@ def explore_drafts(request): context_instance=RequestContext(request)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def module_order_list(request): response_dict = {"success": False} module_id_list = request.POST.get('module_list', []) try: - items_sort_list_gattr_node = triple_collection.one({'_type': 'GAttribute', 'subject': group_id, + items_sort_list_gattr_node = triple_collection.one({'_type': 'GAttribute', 'subject': group_id, 'attribute_type': at_items_sort_list._id, 'status': u'PUBLISHED'}) if items_sort_list_gattr_node: ga_node = delete_gattribute(node_id=items_sort_list_gattr_node._id, deletion_type=0) diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/export_to_epub.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/export_to_epub.py index bc72d65969..a98a103610 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/export_to_epub.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/export_to_epub.py @@ -10,6 +10,9 @@ from django.template.defaultfilters import slugify from gnowsys_ndf.settings import GSTUDIO_EPUBS_LOC_PATH from gnowsys_ndf.ndf.models import node_collection + +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control try: from bson import ObjectId except ImportError: # old pymongo @@ -27,7 +30,6 @@ # tool_mapping = {'policequad': 'modules/Tools/Police Quad/index.html', # 'turtleblocksjs': 'modules/Tools/Turtle Blocks/index.html', # 'biomechanic': 'modules/Tools/Bio- Mechanic/index.html'} - def create_subfolders(root,subfolder_names_list): for subfolder in subfolder_names_list: os.makedirs(os.path.join(root, subfolder)) @@ -71,7 +73,7 @@ def create_update_ncx(file_display_name, file_slugified_name): with open(ncx_file_path, "w+") as ncx_file: navMap_ele = soup.find("navMap") navpoint_ctr_val = len(soup.find_all("navPoint")) + 1 - navPoint_ele = soup.new_tag("navPoint", + navPoint_ele = soup.new_tag("navPoint", id="navPoint"+(navpoint_ctr_val).__str__(), # playorder=(navpoint_ctr_val).__str__() ) @@ -116,7 +118,7 @@ def create_update_content_file(file_name_wo_ext, file_loc, media_type, epub_nam file_loc : Text|Styles|Misc media-type: text/css|text/javascript """ - + file_name_w_ext = file_name_wo_ext file_path = os.path.join(file_loc,file_name_wo_ext) if not is_non_html: @@ -216,7 +218,7 @@ def parse_content(path, content_soup, epub_name): each_script.extract() - # ==== updating media elements ==== + # ==== updating media elements ==== #Transcipt file all_transcript_data = content_soup.find_all(attrs={'class':'transcript'}) for each_transcript in all_transcript_data: @@ -251,13 +253,13 @@ def parse_content(path, content_soup, epub_name): new_iframe_src = iframe_src_attr if iframe_src_attr: if "assessment.AssessmentOffered" in iframe_src_attr: - # ==== updating assessment iframes ==== + # ==== updating assessment iframes ==== new_iframe_src = iframe_src_attr parsed = urlparse.urlparse(iframe_src_attr) new_iframe_src = parsed._replace(netloc="localhost:8888", path="/oea/") each_iframe["src"] = new_iframe_src.geturl() else: - # ==== updating App iframes ==== + # ==== updating App iframes ==== for each_tool_key,each_tool_val in tool_mapping.items(): if each_tool_key in iframe_src_attr: new_iframe_src = each_tool_val @@ -297,7 +299,7 @@ def build_html(path,obj, epub_name): 1. Clone base-skeleton html file 2. Build by adding content object 3. parse_content - + """ soup = None @@ -407,8 +409,7 @@ def create_epub(node_obj): def check_ip_validity(): import re - if re.match(r'^((\d{1,2}|1\d{2}|2[0-4]\d|25[0-5])\.){3}(\d{1,2}|1\d{2}|2[0-4]\d|25[0-5])$', ip): - print "Valid IP" + if re.match(r'^((\d{1,2}|1\d{2}|2[0-4]\d|25[0-5])\.){3}(\d{1,2}|1\d{2}|2[0-4]\d|25[0-5])$', ip): + print "Valid IP" else: print "Invalid IP" - diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/feeds.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/feeds.py index 9624730407..373a3a71aa 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/feeds.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/feeds.py @@ -19,7 +19,8 @@ from django.contrib.syndication.views import Feed from django.core.urlresolvers import reverse - +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control try: from bson import ObjectId @@ -32,7 +33,6 @@ analytics_collection = db[Analytics.collection_name] ins_objectid = ObjectId() - class activity_feed(Feed): title_template = 'ndf/feed_updates_title.html' @@ -82,4 +82,3 @@ def item_link(self, item): def item_guid(self, item) : return item['_id'] - diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/file.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/file.py index 3fe54986b2..3cda982cc5 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/file.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/file.py @@ -15,6 +15,8 @@ from PIL import Image, ImageDraw from StringIO import StringIO +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control ''' -- imports from installed packages -- ''' from django.http import HttpResponseRedirect, HttpResponse, Http404 @@ -64,6 +66,7 @@ count = 0 @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def file(request, group_id, file_id=None, page_no=1): """ Renders a list of all 'Files' available within the database. @@ -524,6 +527,7 @@ def get_query_cursor_filetype(operator, member_of_list, group_id, userid, page_n return result_dict @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def paged_file_objs(request, group_id, filetype, page_no): ''' Method to implement pagination in File and E-Library app. @@ -752,6 +756,7 @@ def paged_file_objs(request, group_id, filetype, page_no): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def uploadDoc(request, group_id): try: @@ -783,6 +788,7 @@ def uploadDoc(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def submitDoc(request, group_id): """ submit files for saving into gridfs and creating object @@ -1393,6 +1399,7 @@ def GetDoc(request, group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def file_search(request, group_id): # ins_objectid = ObjectId() # if ins_objectid.is_valid(group_id) is False : @@ -1421,6 +1428,7 @@ def file_search(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def delete_file(request, group_id, _id): """Delete file and its data """ @@ -1458,6 +1466,7 @@ def delete_file(request, group_id, _id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def file_detail(request, group_id, _id): """Depending upon mime-type of the node, this view returns respective display-view. """ @@ -1568,7 +1577,7 @@ def file_detail(request, group_id, _id): context_instance = RequestContext(request) ) - +@cache_control(must_revalidate=True, max_age=6) def file_content(request, group_id): node_id = request.GET.get('id', None) @@ -1583,6 +1592,7 @@ def file_content(request, group_id): }, context_instance = RequestContext(request)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def getFileThumbnail(request, group_id, _id): """Returns thumbnail of respective file """ @@ -1667,6 +1677,7 @@ def getFileThumbnail(request, group_id, _id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def readDoc(request, _id, group_id, file_name=""): '''Return Files ''' @@ -1717,6 +1728,7 @@ def readDoc(request, _id, group_id, file_name=""): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def read_attachment(request, group_id, file_path): file_path = '/' + file_path with open(file_path,'r') as download_file: @@ -1725,7 +1737,7 @@ def read_attachment(request, group_id, file_path): response['Content-Disposition'] = 'attachment; filename=' + file_path.split("/")[-1] return response - +@cache_control(must_revalidate=True, max_age=6) @get_execution_time def file_edit(request,group_id,_id): # ins_objectid = ObjectId() @@ -1836,7 +1848,7 @@ def file_edit(request,group_id,_id): context_instance=RequestContext(request) ) - +@cache_control(must_revalidate=True, max_age=6) def get_gridfs_resource(request, gridfs_id): # print gridfs_id diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/filehive.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/filehive.py index e11752fc79..aa3868045c 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/filehive.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/filehive.py @@ -9,6 +9,8 @@ from django.shortcuts import render_to_response from django.template import RequestContext +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control from gnowsys_ndf.settings import MEDIA_ROOT, GSTUDIO_SITE_DEFAULT_LANGUAGE from gnowsys_ndf.ndf.models import node_collection, filehive_collection, gfs @@ -24,13 +26,13 @@ gst_file = node_collection.one({'_type': u'GSystemType', 'name': u'File'}) gst_file_id = gst_file._id +@cache_control(must_revalidate=True, max_age=6) def upload_form(request, group_id): if request.method == 'GET': return render_to_response('ndf/filehive.html', { 'group_id': group_id, 'groupid': group_id, }, context_instance=RequestContext(request)) - def write_files(request, group_id, make_collection=False, unique_gs_per_file=True, **kwargs): user_id = request.user.id @@ -103,7 +105,7 @@ def write_files(request, group_id, make_collection=False, unique_gs_per_file=Tru # 'group_id': group_id, 'groupid': group_id, # }, context_instance=RequestContext(request)) - +@cache_control(must_revalidate=True, max_age=6) def read_file(request, group_id): all_fgs = node_collection.find({'_type': 'GSystem', 'member_of': gst_file._id}) diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/forum.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/forum.py index 1f55fe1dcf..c5aa10c4d6 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/forum.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/forum.py @@ -16,6 +16,8 @@ from django.contrib.sites.models import Site from django.contrib.auth.decorators import login_required +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control ''' -- imports from django_mongokit -- ''' ''' -- imports from gstudio -- ''' @@ -50,6 +52,7 @@ @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def forum(request, group_id, node_id=None): ''' Method to list all the available forums and to return forum-search-query result. @@ -120,6 +123,7 @@ def forum(request, group_id, node_id=None): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def create_forum(request, group_id): ''' Method to create forum and Retrieve all the forums @@ -240,6 +244,7 @@ def create_forum(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def edit_forum(request,group_id,forum_id): ''' Method to create forum and Retrieve all the forums @@ -360,6 +365,7 @@ def edit_forum(request,group_id,forum_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def display_forum(request,group_id,forum_id): hide_create_thread_btn = True other_forums_list = None @@ -411,6 +417,7 @@ def display_forum(request,group_id,forum_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def display_thread(request,group_id, thread_id, forum_id=None): ''' Method to display thread and it's content @@ -483,6 +490,7 @@ def display_thread(request,group_id, thread_id, forum_id=None): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def create_thread(request, group_id, forum_id): ''' Method to create thread @@ -590,6 +598,7 @@ def create_thread(request, group_id, forum_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def add_node(request, group_id): # ins_objectid = ObjectId() @@ -774,6 +783,7 @@ def get_profile_pic(username): @login_required @check_delete @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def delete_forum(request,group_id,node_id,relns=None): """ Changing status of forum to HIDDEN """ @@ -821,6 +831,7 @@ def delete_forum(request,group_id,node_id,relns=None): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def delete_thread(request,group_id,forum_id,node_id): """ Changing status of thread to HIDDEN """ @@ -883,6 +894,7 @@ def delete_thread(request,group_id,forum_id,node_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def edit_thread(request,group_id,forum_id,thread_id): # ins_objectid = ObjectId() # if ins_objectid.is_valid(group_id) is False : @@ -962,6 +974,7 @@ def edit_thread(request,group_id,forum_id,thread_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def delete_reply(request,group_id,forum_id,thread_id,node_id): # ins_objectid = ObjectId() diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/gcache.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/gcache.py index 57cc590769..446efb6493 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/gcache.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/gcache.py @@ -1,5 +1,8 @@ from django.core.cache import cache +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control + class Gcache(object): """docstring for Gcache""" def __init__(self, arg): diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/gcourse.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/gcourse.py index a4fe120c48..ff075568ac 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/gcourse.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/gcourse.py @@ -18,6 +18,8 @@ from django.core.cache import cache from mongokit import IS from mongokit import paginator +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control try: from bson import ObjectId except ImportError: # old pymongo @@ -41,7 +43,7 @@ from gnowsys_ndf.ndf.views.methods import create_gattribute, create_grelation, create_task, delete_grelation, node_thread_access, get_group_join_status, delete_node, auto_enroll, add_to_author_set from gnowsys_ndf.notification import models as notification from gnowsys_ndf.settings import GSTUDIO_NOTE_CREATE_POINTS, GSTUDIO_QUIZ_CORRECT_POINTS, GSTUDIO_COMMENT_POINTS, GSTUDIO_FILE_UPLOAD_POINTS -from gnowsys_ndf.ndf.views.trash import trash_resource +from gnowsys_ndf.ndf.views.trash import trash_resource from gnowsys_ndf.ndf.views.translation import get_lang_node,get_trans_node_list,get_course_content_hierarchy, get_unit_hierarchy from gnowsys_ndf.ndf.views.assessment_analytics import user_assessment_results @@ -64,6 +66,7 @@ app = GST_COURSE @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def course(request, group_id, course_id=None): """ * Renders a list of all 'courses' available within the database. @@ -140,6 +143,7 @@ def course(request, group_id, course_id=None): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def create_edit(request, group_id, node_id=None): """Creates/Modifies details of base course group. """ @@ -269,6 +273,7 @@ def create_edit(request, group_id, node_id=None): # @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def course_detail(request, group_id, _id): try: group_id = ObjectId(group_id) @@ -341,6 +346,7 @@ def course_detail(request, group_id, _id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def course_create_edit(request, group_id, app_id, app_set_id=None, app_set_instance_id=None, app_name=None): """ Creates/Modifies document of given sub-types of Course(s). @@ -837,6 +843,7 @@ def course_create_edit(request, group_id, app_id, app_set_id=None, app_set_insta @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def mis_course_detail(request, group_id, app_id=None, app_set_id=None, app_set_instance_id=None, app_name=None): """ Detail view of NUSSD Course/ Announced Course @@ -1062,6 +1069,7 @@ def mis_course_detail(request, group_id, app_id=None, app_set_id=None, app_set_i # Ajax views for setting up Course Structure @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def create_course_struct(request, group_id, node_id): """ This view is to create the structure of the Course. @@ -1142,6 +1150,7 @@ def create_course_struct(request, group_id, node_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def save_course_section(request, group_id): ''' Accepts: @@ -1194,6 +1203,7 @@ def save_course_section(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def save_course_sub_section(request, group_id): ''' Accepts: @@ -1249,6 +1259,7 @@ def save_course_sub_section(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def change_node_name(request, group_id): ''' Accepts: @@ -1272,6 +1283,7 @@ def change_node_name(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def change_order(request, group_id): ''' Accepts: @@ -1305,6 +1317,7 @@ def change_order(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def course_sub_section_prop(request, group_id): ''' Accepts: @@ -1373,6 +1386,7 @@ def course_sub_section_prop(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def add_units(request, group_id): ''' Accepts: @@ -1418,6 +1432,7 @@ def add_units(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_resources(request, group_id): ''' Accepts: @@ -1491,6 +1506,7 @@ def get_resources(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def save_resources(request, group_id): ''' Accepts: @@ -1590,6 +1606,7 @@ def save_resources(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def create_edit_unit(request, group_id): ''' Accepts: @@ -1648,6 +1665,7 @@ def create_edit_unit(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def delete_course(request, group_id, node_id): del_stat = delete_item(node_id) if del_stat: @@ -1656,6 +1674,7 @@ def delete_course(request, group_id, node_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def delete_from_course_structure(request, group_id): ''' Accepts: @@ -1709,6 +1728,7 @@ def delete_item(item, ce_flag=False): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def enroll_generic(request, group_id): response_dict = {"success": False} if request.is_ajax() and request.method == "POST": @@ -1742,6 +1762,7 @@ def enroll_generic(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def remove_resource_from_unit(request, group_id): ''' Accepts: @@ -1771,6 +1792,7 @@ def remove_resource_from_unit(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def add_course_file(request, group_id): # this is context node getting from the url get request context_node_id = request.GET.get('context_node', '') @@ -1825,6 +1847,7 @@ def add_course_file(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def unsubscribe_from_group(request, group_id): ''' Accepts: @@ -1866,6 +1889,7 @@ def unsubscribe_from_group(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def enroll_to_course(request, group_id): ''' Accepts: @@ -1928,6 +1952,7 @@ def _send_notif(userid, group_obj): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def set_release_date_css(request, group_id): response_dict = {"success": False} try: @@ -1950,6 +1975,7 @@ def set_release_date_css(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def course_summary(request, group_id): group_obj = get_group_name_id(group_id, get_obj=True) @@ -1967,6 +1993,7 @@ def course_summary(request, group_id): return render_to_response(template, variable) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def course_resource_detail(request, group_id, course_sub_section, course_unit, resource_id): group_name, group_id = get_group_name_id(group_id) @@ -2014,6 +2041,7 @@ def course_resource_detail(request, group_id, course_sub_section, course_unit, r @auto_enroll @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def activity_player_detail(request, group_id, lesson_id, activity_id): group_obj = get_group_name_id(group_id, get_obj=True) @@ -2032,7 +2060,7 @@ def activity_player_detail(request, group_id, lesson_id, activity_id): if trans_lesson_node: lesson_name = trans_lesson_node.name else: - lesson_name = lesson_node.name + lesson_name = lesson_node.name # all metadata reg position and next prev of resource translation_obj = node_obj.get_relation('translation_of') @@ -2045,11 +2073,11 @@ def activity_player_detail(request, group_id, lesson_id, activity_id): {'name': 1, 'altnames': 1,'_id':1}) act_list = [] trans_act_list = get_trans_node_list(lesson_node.collection_set,request.LANGUAGE_CODE) - - lesson_index = group_obj_collection_set.index(lesson_node._id) + + lesson_index = group_obj_collection_set.index(lesson_node._id) resource_index = lesson_obj_collection_set.index(node_obj._id) - + if (resource_index + 1) < resource_count: resource_next_id = lesson_node.collection_set[resource_index + 1] @@ -2087,14 +2115,14 @@ def activity_player_detail(request, group_id, lesson_id, activity_id): 'trans_lesson_name':lesson_name, 'no_footer': True } - - + + if prev_lesson_obj and prev_lesson_obj.collection_set: context_variables.update({ 'lesson_act_prev_id': prev_lesson_obj.collection_set[0],'prev_lesson_id':prev_lesson_obj._id }) if next_lesson_obj and next_lesson_obj.collection_set: context_variables.update({ 'next_lesson_id':next_lesson_obj._id,'lesson_next_act_id': next_lesson_obj.collection_set[0] }) - - + + if request.user.is_authenticated(): active_user_ids_list = [request.user.id] if GSTUDIO_BUDDY_LOGIN: @@ -2121,6 +2149,7 @@ def activity_player_detail(request, group_id, lesson_id, activity_id): # Following View Not in Use @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def course_dashboard(request, group_id): group_obj = get_group_name_id(group_id, get_obj=True) @@ -2179,6 +2208,7 @@ def _get_current_and_old_display_pics(group_obj): # :::::::::::::::::::::::::::::::::TAB VIEWS BEGINS:::::::::::::::::::::: @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def course_content(request, group_id): group_obj = get_group_name_id(group_id, get_obj=True) @@ -2211,6 +2241,7 @@ def course_content(request, group_id): return render_to_response(template, context_variables) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def course_notebook(request, group_id, node_id=None, tab="my-notes"): group_obj = get_group_name_id(group_id, get_obj=True) group_id = group_obj._id @@ -2301,9 +2332,9 @@ def course_notebook(request, group_id, node_id=None, tab="my-notes"): tab = 'all-notes' if notebook_obj and not create_flag: - # return HttpResponseRedirect(reverse('course_notebook_tab_note', + # return HttpResponseRedirect(reverse('course_notebook_tab_note', # kwargs={'group_id': group_id, "node_id": notebook_obj.pk, 'tab': tab})) - return HttpResponseRedirect(reverse('course_notebook_note', + return HttpResponseRedirect(reverse('course_notebook_note', kwargs={'group_id': group_id, "node_id": notebook_obj.pk})) context_variables.update({'allow_to_comment': allow_to_comment}) @@ -2317,6 +2348,7 @@ def course_notebook(request, group_id, node_id=None, tab="my-notes"): ) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def course_raw_material(request, group_id, node_id=None,page_no=1): from gnowsys_ndf.settings import GSTUDIO_NO_OF_OBJS_PP @@ -2357,10 +2389,10 @@ def course_raw_material(request, group_id, node_id=None,page_no=1): asset_gst_name, asset_gst_id = GSystemType.get_gst_name_id("Asset") asset_nodes = node_collection.find({'member_of': {'$in': [asset_gst_id]}, 'group_set': {'$all': [ObjectId(group_id)]},'tags': "raw@material"}).sort('last_update', -1) - + # from collections import defaultdict # asset_thumbnail = defaultdict(list) - + # data_list = [] # for each in asset_nodes: # grel_asstcontent = get_relation_value (each.pk, 'has_assetcontent') @@ -2369,7 +2401,7 @@ def course_raw_material(request, group_id, node_id=None,page_no=1): # if each_rel['if_file']['original']['relurl']: # asset_thumbnail[each._id].append(each_rel['if_file']['original']['relurl']) # data_list.append(asset_thumbnail) - + for each in asset_nodes: each.get_neighbourhood(each.member_of) @@ -2431,15 +2463,15 @@ def course_raw_material(request, group_id, node_id=None,page_no=1): if gstaff_access: allow_to_upload = True template = 'ndf/gcourse_event_group.html' - + if "announced_unit" in group_obj.member_of_names_list or "Group" in group_obj.member_of_names_list or "base_unit" in group_obj.member_of_names_list or 'Author' in group_obj.member_of_names_list : template = 'ndf/lms.html' # assets_page_info = paginator.Paginator(asset_nodes, page_no, GSTUDIO_NO_OF_OBJS_PP) # context_variables.update({'assets_page_info':assets_page_info}) if 'BaseCourseGroup' in group_obj.member_of_names_list: template = 'ndf/basecourse_group.html' - - + + context_variables.update({'title':'raw material' ,'files_cur': files_cur,'raw_material_page_info':raw_material_page_info ,'allow_to_upload': allow_to_upload,'allow_to_join': allow_to_join}) return render_to_response(template, @@ -2448,6 +2480,7 @@ def course_raw_material(request, group_id, node_id=None,page_no=1): ) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def course_gallery(request, group_id,node_id=None,page_no=1): from gnowsys_ndf.settings import GSTUDIO_NO_OF_OBJS_PP @@ -2511,19 +2544,19 @@ def course_gallery(request, group_id,node_id=None,page_no=1): context_variables.update({'files_cur': files_cur}) gallery_page_info = paginator.Paginator(files_cur, page_no, GSTUDIO_NO_OF_OBJS_PP) context_variables.update({'gallery_page_info':gallery_page_info,'coll_cur':files_cur}) - + asset_gst_name, asset_gst_id = GSystemType.get_gst_name_id("Asset") - + asset_nodes = node_collection.find({'member_of': {'$in': [asset_gst_id]}, 'group_set': {'$all': [ObjectId(group_id)]},'tags': "asset@gallery"}).sort('last_update', -1) - + template = 'ndf/gcourse_event_group.html' - + if "announced_unit" in group_obj.member_of_names_list or "Group" in group_obj.member_of_names_list or 'Author' in group_obj.member_of_names_list or 'base_unit' in group_obj.member_of_names_list: template = 'ndf/lms.html' # assets_page_info = paginator.Paginator(asset_nodes, page_no, GSTUDIO_NO_OF_OBJS_PP) # context_variables.update({'assets_page_info':assets_page_info}) - + context_variables.update({'asset_nodes': asset_nodes}) return render_to_response(template, @@ -2532,6 +2565,7 @@ def course_gallery(request, group_id,node_id=None,page_no=1): ) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def course_about(request, group_id): group_obj = Group.get_group_name_id(group_id, get_obj=True) group_id = group_obj._id @@ -2553,7 +2587,7 @@ def course_about(request, group_id): # print 'Weeks:', (end_day - start_day).days / 7 weeks_count = (end_day - start_day).days / 7 - + show_analytics_notifications = True template = 'ndf/gcourse_event_group.html' context_variables = { @@ -2572,10 +2606,10 @@ def course_about(request, group_id): educationallevel = get_attribute_value(group_obj._id,"educationallevel") context_variables.update({'educationalsubject_val': educationalsubject, "educationallevel_val": educationallevel}) - + if 'announced_unit' in group_obj.member_of_names_list or 'Group' in group_obj.member_of_names_list or 'Author' in group_obj.member_of_names_list and 'base_unit' not in group_obj.member_of_names_list: template = 'ndf/lms.html' - + banner_pic_obj,old_profile_pics = _get_current_and_old_display_pics(group_obj) context_variables.update({'old_profile_pics':old_profile_pics, "prof_pic_obj": banner_pic_obj, @@ -2586,6 +2620,7 @@ def course_about(request, group_id): # :::::::::::::::::::::::::::::::::TAB VIEWS ENDS:::::::::::::::::::::: @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def course_gallerymodal(request, group_id, node_id): group_obj = get_group_name_id(group_id, get_obj=True) group_id = group_obj._id @@ -2611,6 +2646,7 @@ def course_gallerymodal(request, group_id, node_id): return render_to_response(template, context_variables) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def course_note_page(request, group_id): group_obj = get_group_name_id(group_id, get_obj=True) @@ -2638,6 +2674,7 @@ def course_note_page(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def inline_edit_res(request, group_id): group_obj = get_group_name_id(group_id, get_obj=True) group_id = group_obj._id @@ -2669,6 +2706,7 @@ def inline_edit_res(request, group_id): return render_to_response(template, context_variables, context_instance = RequestContext(request)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def course_filters(request, group_id): group_obj = get_group_name_id(group_id, get_obj=True) @@ -2776,6 +2814,7 @@ def course_filters(request, group_id): # @login_required # commented on-purpose for generating user-csvs @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def course_analytics(request, group_id, user_id, render_template=False, get_result_dict=False, **kwargs): # set get_result_dict=True to get only raw data in dict format, # without being redirected to template. So that this method can @@ -2791,11 +2830,11 @@ def course_analytics(request, group_id, user_id, render_template=False, get_resu # ) # possible kwargs keys: - # + # # `get_counter_obj_in_result` # flag named such to avoid confusion with builtin Counter method # - default value is False (i.e: get_counter_obj_in_result=False) # - By setting this to True, result dict will have counter object as a value for key, `counter_obj` - # + # # `assessment_and_quiz_data` analytics_data = {'user_id': user_id} analytics_data.update({ @@ -2809,7 +2848,7 @@ def course_analytics(request, group_id, user_id, render_template=False, get_resu }) data_points_dict = {} assessment_and_quiz_data = kwargs.get('assessment_and_quiz_data', False) - + try: # user_obj = User.objects.get(pk=int(user_id)) author_obj = node_collection.one({ '_type': u'Author', 'created_by': int(user_id) }) @@ -2920,7 +2959,7 @@ def course_analytics(request, group_id, user_id, render_template=False, get_resu for each_lesson_key, each_lesson_val in each_lesson_dict.iteritems(): if each_lesson_key == 'id': lesson_id = each_lesson_dict[each_lesson_key] - + if each_lesson_key == 'activities': all_activities = all_activities + len(each_lesson_dict[each_lesson_key]) for each_act_dict in each_lesson_dict[each_lesson_key]: @@ -3123,6 +3162,7 @@ def course_analytics(request, group_id, user_id, render_template=False, get_resu @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def course_analytics_admin(request, group_id): cache_key = u'course_analytics_admin' + unicode(slugify(group_id)) @@ -3240,6 +3280,7 @@ def course_analytics_admin(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def build_progress_bar(request, group_id, node_id): cache_key = u'build_progress_bar_' + unicode(slugify(group_id)) + "_" + unicode(node_id) + "_" + unicode(request.user.id) cache_result = cache.get(cache_key) @@ -3258,6 +3299,7 @@ def build_progress_bar(request, group_id, node_id): return HttpResponse(json.dumps(result_status)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_resource_completion_status(request, group_id): result_dict = {'COMPLETED':[]} cr_ids = request.GET.get("cr_ids", "") @@ -3277,6 +3319,7 @@ def get_resource_completion_status(request, group_id): @get_execution_time @login_required +@cache_control(must_revalidate=True, max_age=6) def manage_users(request, group_id): group_obj = get_group_name_id(group_id, get_obj=True) group_id = group_obj._id @@ -3292,6 +3335,7 @@ def manage_users(request, group_id): ) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def assets(request, group_id, asset_id=None,page_no=1): try: group_id = ObjectId(group_id) @@ -3306,7 +3350,7 @@ def assets(request, group_id, asset_id=None,page_no=1): asset_obj = node_collection.one({'_id': ObjectId(asset_id)}) asset_content_list = get_relation_value(ObjectId(asset_obj._id),'has_assetcontent') # topic_gst_name, topic_gst_id = GSystemType.get_gst_name_id("Topic") - + asset_nodes = node_collection.find({'member_of': {'$in': [asset_gst_id]}, 'group_set': {'$all': [ObjectId(group_id)]}}).sort('last_update', -1) # topic_nodes = node_collection.find({'member_of': {'$in': [topic_gst_id]}}) @@ -3318,14 +3362,14 @@ def assets(request, group_id, asset_id=None,page_no=1): 'group_obj':group_obj, 'group_name':group_obj.name } if 'announced_unit' in group_obj.member_of_names_list or 'Group' in group_obj.member_of_names_list and 'base_unit' not in group_obj.member_of_names_list : - + if 'raw@material' in asset_obj.tags: context_variables.update({'title':'raw_material_detail'}) template = 'ndf/lms.html' elif 'asset@gallery' in asset_obj.tags: context_variables.update({'title':'asset_gallery_detail'}) template = 'ndf/lms.html' - + else: #template = 'ndf/gevent_base.html' template = 'ndf/lms.html' @@ -3338,17 +3382,18 @@ def assets(request, group_id, asset_id=None,page_no=1): 'group_set': {'$all': [ObjectId(group_id)]}}).sort('last_update', -1) assets_page_info = paginator.Paginator(asset_nodes, page_no, GSTUDIO_NO_OF_OBJS_PP) context_variables = { - 'group_id': group_id, 'groupid': group_id, 'group_name':group_obj.name, + 'group_id': group_id, 'groupid': group_id, 'group_name':group_obj.name, 'asset_nodes': asset_nodes,'title':'asset_list', 'group_obj':group_obj,'assets_page_info':assets_page_info } - + return render_to_response(template, context_variables, context_instance = RequestContext(request) ) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def assetcontent_detail(request, group_id, asset_id,asst_content_id,page_no=1): from gnowsys_ndf.settings import GSTUDIO_NO_OF_OBJS_PP assetcontent_obj = node_collection.one({'_id': ObjectId(asst_content_id)}) @@ -3375,13 +3420,14 @@ def assetcontent_detail(request, group_id, asset_id,asst_content_id,page_no=1): context_variables.update( {'title':"raw_material_detail"}) if "asset@gallery" in asset_obj.tags: context_variables.update( {'title':"asset_gallery_detail"}) - + return render_to_response(template, context_variables, context_instance = RequestContext(request) ) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def create_edit_course_page(request, group_id, page_id=None,page_type=None): group_obj = get_group_name_id(group_id, get_obj=True) group_id = group_obj._id @@ -3418,6 +3464,7 @@ def create_edit_course_page(request, group_id, page_id=None,page_type=None): ) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def course_pages(request, group_id, page_id=None,page_no=1): from gnowsys_ndf.settings import GSTUDIO_NO_OF_OBJS_PP group_obj = get_group_name_id(group_id, get_obj=True) @@ -3432,7 +3479,7 @@ def course_pages(request, group_id, page_id=None,page_no=1): if page_id: node_obj = node_collection.one({'_id': ObjectId(page_id)}) - + rt_translation_of = Node.get_name_id_from_type('translation_of', 'RelationType', get_obj=True) other_translations_grels = triple_collection.find({ @@ -3442,7 +3489,7 @@ def course_pages(request, group_id, page_id=None,page_no=1): 'right_subject': {'$nin': [node_obj._id]} }) other_translations = node_collection.find({'_id': {'$in': [r.right_subject for r in other_translations_grels]} }) - + context_variables.update({'activity_node': node_obj, 'hide_breadcrumbs': True,'other_translations':other_translations}) context_variables.update({'editor_view': False}) @@ -3462,6 +3509,7 @@ def course_pages(request, group_id, page_id=None,page_no=1): ) @login_required +@cache_control(must_revalidate=True, max_age=6) def save_course_page(request, group_id): group_obj = get_group_name_id(group_id, get_obj=True) group_id = group_obj._id @@ -3470,7 +3518,7 @@ def save_course_page(request, group_id): if tags: tags = json.loads(tags) else: - tags = [] + tags = [] #template = 'ndf/gevent_base.html' template = 'ndf/lms.html' page_gst_name, page_gst_id = GSystemType.get_gst_name_id("Page") @@ -3495,7 +3543,7 @@ def save_course_page(request, group_id): if is_info_page == "Info": info_page_gst_name, info_page_gst_id = GSystemType.get_gst_name_id('Info page') page_obj.type_of = [info_page_gst_id] - + if activity_lang: language = get_language_tuple(activity_lang) page_obj.language = language @@ -3531,6 +3579,7 @@ def save_course_page(request, group_id): kwargs={'group_id': group_id, 'page_id': page_obj._id})) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def load_content_data(request, group_id): node_id = request.GET.get("node_id", "") node = node_collection.one({'_id': ObjectId(node_id)}) @@ -3542,6 +3591,7 @@ def load_content_data(request, group_id): },context_instance=RequestContext(request)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def delete_activity_page(request, group_id): activity_id_list = request.POST.getlist('delete_files_list[]', '') activity_id = request.POST.get('activity_id', '') @@ -3633,6 +3683,7 @@ def _get_unit_hierarchy(unit_group_obj,lang="en"): return unit_structure @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def widget_page_create_edit(request, group_id, node_id=None): node_id = request.GET.get('node_id', None) detail_url = request.GET.get('detail_url',) @@ -3675,10 +3726,11 @@ def widget_page_create_edit(request, group_id, node_id=None): return render_to_response(template, req_context) @login_required +@cache_control(must_revalidate=True, max_age=6) def load_assessment_analytics(request, group_id): domain = request.GET.get('domain') - result_set = {'correct_attempted_quizitems': 0, 'visited_quizitems': 0, - 'unattempted_quizitems': 0, 'attempted_quizitems': 0, + result_set = {'correct_attempted_quizitems': 0, 'visited_quizitems': 0, + 'unattempted_quizitems': 0, 'attempted_quizitems': 0, 'incorrect_attempted_quizitems': 0, 'notapplicable_quizitems': 0} user_id = request.GET.get('user_id') group_obj = get_group_name_id(group_id, get_obj=True) @@ -3687,7 +3739,7 @@ def load_assessment_analytics(request, group_id): # Variable Decalarations correctAttemptCount = unattemptedCount = 0 notapplicableCount = incorrectCount = attemptedCount = 0 - count_dict = {'correctAttemptCount': correctAttemptCount, + count_dict = {'correctAttemptCount': correctAttemptCount, 'unattemptedCount': unattemptedCount, 'notapplicableCount': notapplicableCount, 'incorrectCount': incorrectCount, 'attemptedCount': attemptedCount} total_items = 0 @@ -3715,7 +3767,7 @@ def load_assessment_analytics(request, group_id): #create if not counter_obj['assessment']: assessment_dict = {'id': each_sublist[1], 'correct': user_data_set['Correct'], - 'notapplicable': user_data_set['NotApplicable'], 'attempted': user_data_set['Attempted'], + 'notapplicable': user_data_set['NotApplicable'], 'attempted': user_data_set['Attempted'], 'incorrect': user_data_set['Incorrect']} counter_obj['assessment'].append(assessment_dict) counter_obj['group_points'] += (user_data_set['Correct'] * GSTUDIO_QUIZ_CORRECT_POINTS) @@ -3778,7 +3830,7 @@ def update_assessment_analytics_for_buddies(offeredId, user_ids, logged_in_user_ #create if not counter_obj['assessment']: assessment_dict = {'id': offeredId, 'correct': user_data_set['Correct'], - 'notapplicable': user_data_set['NotApplicable'], 'attempted': user_data_set['Attempted'], + 'notapplicable': user_data_set['NotApplicable'], 'attempted': user_data_set['Attempted'], 'incorrect': user_data_set['Incorrect']} counter_obj['assessment'].append(assessment_dict) counter_obj['group_points'] += (user_data_set['Correct'] * GSTUDIO_QUIZ_CORRECT_POINTS) @@ -3811,6 +3863,7 @@ def update_assessment_analytics_for_buddies(offeredId, user_ids, logged_in_user_ return succes_update @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def course_quiz_data(request, group_id, all_data=False): ''' all_data = True, will return checked and subimitted data @@ -3870,19 +3923,19 @@ def _merged_to_from(min_list, max_list, na_index): for each_record in record_set['result']: for record_key,record_val in each_record.items(): if record_key == "user_id": - # To prevent in error in case where + # To prevent in error in case where # User object does not exist, return user-id user_obj = User.objects.get(pk=int(record_val)) if user_obj: username = user_obj.username else: - username = record_val + username = record_val each_record['user_id'] = username if record_key == "thread_node" and record_val: # QuizItemPost's prior_node list contains ObjectId # of its Thread node and QuizItemEvent node - qie_node = node_collection.find_one({'_id': {'$in': record_val}, + qie_node = node_collection.find_one({'_id': {'$in': record_val}, 'name': {'$regex': '^(?!Thread of).*'}}) each_record['name'] = qie_node.content @@ -3948,6 +4001,7 @@ def _merged_to_from(min_list, max_list, na_index): context_instance=RequestContext(request)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def finish_lesson(request, group_id, node_id): response_dict = {'success': False} try: @@ -3961,6 +4015,6 @@ def finish_lesson(request, group_id, node_id): lesson_node.save(groupid=group_id) response_dict.update({'success': True}) except Exception as complete_node_err: - print "\nError occurred in complete_node(). ", complete_node_err + print "\nError occurred in complete_node(). ", complete_node_err pass return HttpResponse(json.dumps(response_dict)) diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/group.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/group.py index 0320bf3c77..07593989d0 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/group.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/group.py @@ -17,6 +17,8 @@ from django.contrib.auth.models import User from django.views.generic import View from django.core.cache import cache +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control try: from bson import ObjectId @@ -1381,7 +1383,7 @@ def call_setup(self, request, node, prior_node_obj, group_obj): if any(base_gs_mem in ["lesson"] for base_gs_mem in each_res_node_mem_list): gst_node_id = self.lesson_gst._id - new_res = replicate_resource(request, each_res_node, + new_res = replicate_resource(request, each_res_node, group_obj._id, mem_of_node_id=gst_node_id) # new_res = self.replicate_resource(request, each_res_node, group_obj) prior_node_obj.collection_set.append(new_res._id) @@ -1428,6 +1430,7 @@ class GroupCreateEditHandler(View): @method_decorator(login_required) @method_decorator(staff_required) @method_decorator(get_execution_time) + @method_decorator(cache_control(must_revalidate=True, max_age=6)) def get(self, request, group_id, action): """ Catering GET request of group's create/edit. @@ -1514,6 +1517,7 @@ def get(self, request, group_id, action): @method_decorator(login_required) @method_decorator(staff_required) @method_decorator(get_execution_time) + @method_decorator(cache_control(must_revalidate=True, max_age=6)) def post(self, request, group_id, action): ''' To handle post request of group form. @@ -1611,6 +1615,7 @@ class EventGroupCreateEditHandler(View): @method_decorator(login_required) @method_decorator(staff_required) @method_decorator(get_execution_time) + @method_decorator(cache_control(must_revalidate=True, max_age=6)) def get(self, request, group_id, action, sg_type): """ Catering GET request of group's create/edit. @@ -1682,6 +1687,7 @@ def get(self, request, group_id, action, sg_type): @method_decorator(login_required) @method_decorator(staff_required) @method_decorator(get_execution_time) + @method_decorator(cache_control(must_revalidate=True, max_age=6)) def post(self, request, group_id, action, sg_type): ''' To handle post request of group form. @@ -1720,7 +1726,7 @@ def post(self, request, group_id, action, sg_type): date_result = mod_group.set_event_and_enrollment_dates(request, group_obj._id, parent_group_obj) if sg_type == "CourseEventGroup": - if ("base_unit" in parent_group_obj.member_of_names_list or + if ("base_unit" in parent_group_obj.member_of_names_list or "announced_unit" in parent_group_obj.member_of_names_list): group_obj.member_of = [ObjectId(announced_unit_gst._id)] else: @@ -1814,6 +1820,7 @@ def post(self, request, group_id, action, sg_type): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def group(request, group_id, app_id=None, agency_type=None): """Renders a list of all 'Group-type-GSystems' available within the database. """ @@ -2056,6 +2063,7 @@ def populate_list_of_group_members(group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def group_dashboard(request, group_id=None): try: @@ -2086,7 +2094,7 @@ def group_dashboard(request, group_id=None): if ("base_unit" in group_obj.member_of_names_list or "CourseEventGroup" in group_obj.member_of_names_list or - "BaseCourseGroup" in group_obj.member_of_names_list or + "BaseCourseGroup" in group_obj.member_of_names_list or "announced_unit" in group_obj.member_of_names_list): return HttpResponseRedirect(reverse('course_content', kwargs={'group_id': group_id})) @@ -2380,6 +2388,7 @@ def group_dashboard(request, group_id=None): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def app_selection(request, group_id): from gnowsys_ndf.ndf.views.ajax_views import set_drawer_widget @@ -2448,6 +2457,7 @@ def app_selection(request, group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def switch_group(request,group_id,node_id): from gnowsys_ndf.ndf.views.ajax_views import set_drawer_widget @@ -2590,6 +2600,7 @@ def switch_group(request,group_id,node_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def cross_publish(request, group_id): try: group_id = ObjectId(group_id) @@ -2669,6 +2680,7 @@ def cross_publish(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def publish_group(request,group_id,node): group_obj = get_group_name_id(group_id, get_obj=True) @@ -2705,6 +2717,7 @@ def publish_group(request,group_id,node): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def create_sub_group(request,group_id): try: ins_objectid = ObjectId() @@ -2812,6 +2825,7 @@ def create_sub_group(request,group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def upload_using_save_file(request,group_id): from gnowsys_ndf.ndf.views.file import save_file try: @@ -2822,7 +2836,7 @@ def upload_using_save_file(request,group_id): group_obj = node_collection.one({'_id': ObjectId(group_id)}) title = request.POST.get('context_name','') sel_topic = request.POST.get('topic_list','') - + usrid = request.user.id name = request.POST.get('name') # print "\n\n\nusrid",usrid @@ -3008,6 +3022,7 @@ def upload_using_save_file(request,group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def notification_details(request,group_id): from gnowsys_ndf.ndf.views.utils import get_dict_from_list_of_dicts group_name, group_id = get_group_name_id(group_id) @@ -3022,8 +3037,8 @@ def notification_details(request,group_id): if each.if_file.mime_type: activity = 'created in asset' else: - activity = 'created ' + each.name - + activity = 'created ' + each.name + else: rel_set_dict = get_dict_from_list_of_dicts(each.relation_set) if each.if_file.mime_type and 'assetcontent_of' in rel_set_dict: @@ -3045,10 +3060,10 @@ def notification_details(request,group_id): user_activity_append_temp(each) each.update({'activity':activity}) files_list_append_temp(each) - + return render_to_response('ndf/notification_detail.html', - { + { 'group_id': group_id, 'groupid':group_id, 'activity_list' : files_list diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/home.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/home.py index 19ebff8246..da84308cb7 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/home.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/home.py @@ -9,7 +9,8 @@ from django.views.generic import RedirectView from gnowsys_ndf.ndf.views.methods import get_execution_time from gnowsys_ndf.ndf.views.analytics import * - +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control try: from bson import ObjectId except ImportError: # old pymongo @@ -25,8 +26,9 @@ ################################################### @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def homepage(request, group_id): - + if request.user.is_authenticated(): # auth_gst = node_collection.one({'_type': u'GSystemType', 'name': u'Author'}) # if auth_obj: @@ -39,7 +41,7 @@ def homepage(request, group_id): group on first-time login. This functionality is implemented by using django-registration signal 'user_activated'. (See 'def create_auth_grp' in signals.py) - + if auth is None: auth = node_collection.collection.Author() auth.name = unicode(request.user) @@ -55,7 +57,7 @@ def homepage(request, group_id): auth.modified_by = user_id if user_id not in auth.contributors: auth.contributors.append(user_id) - # Get group_type and group_affiliation stored in node_holder for this author + # Get group_type and group_affiliation stored in node_holder for this author try: temp_details = node_collection.one({'$and':[{'_type':'node_holder'},{'details_to_hold.node_type':'Author'},{'details_to_hold.userid':user_id}]}) if temp_details: @@ -89,6 +91,7 @@ def homepage(request, group_id): return HttpResponseRedirect( reverse('groupchange', kwargs={"group_id": group_id}) ) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def landing_page(request): ''' Method to render landing page after checking variables in local_settings/settings file. @@ -115,9 +118,9 @@ def landing_page(request): context_instance=RequestContext(request) ) elif request.user.id: - return HttpResponseRedirect( reverse('my_desk', kwargs={"group_id": request.user.id}) ) + return HttpResponseRedirect( reverse('my_desk', kwargs={"group_id": request.user.id}) ) else: - + return render_to_response( GSTUDIO_SITE_LANDING_TEMPLATE, { @@ -130,7 +133,7 @@ def landing_page(request): return HttpResponseRedirect( reverse('groupchange', kwargs={"group_id": "home"}) ) -# This class overrides the django's default RedirectView class and allows us to redirect it into user group after user logsin +# This class overrides the django's default RedirectView class and allows us to redirect it into user group after user logsin # class HomeRedirectView(RedirectView): # pattern_name = 'home' @@ -158,7 +161,7 @@ def landing_page(request): # auth.modified_by = user_id # if user_id not in auth.contributors: # auth.contributors.append(user_id) -# # Get group_type and group_affiliation stored in node_holder for this author +# # Get group_type and group_affiliation stored in node_holder for this author # try: # temp_details = node_collection.one({'_type': 'node_holder', 'details_to_hold.node_type': 'Author', 'details_to_hold.userid': user_id}) # if temp_details: @@ -167,24 +170,25 @@ def landing_page(request): # except e as Exception: # print "error in getting node_holder details for an author"+str(e) # auth.save() - + # # This will return a string in url as username and allows us to redirect into user group as soon as user logsin. # #return "/{0}/".format(auth.pk) # if GSTUDIO_SITE_LANDING_PAGE == 'home': # #return "/home/dashboard/group" # return "/home/" -# else: -# return "/{0}/dashboard".format(self.request.user.id) +# else: +# return "/{0}/dashboard".format(self.request.user.id) # else: # # If user is not loggedin it will redirect to home as our base group. # #return "/home/dashboard/group" # return "/home/" @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def help_page_view(request,page_name): # page_obj = Node.get_node_by_id(page_id) help_grp = node_collection.one({'$and':[{'_type': u'Group'}, {'name': u'help'}]}) - + page_obj = node_collection.one({"name":unicode(page_name),"group_set":ObjectId(help_grp._id)}) return render_to_response( "ndf/help_page.html", diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/html_diff.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/html_diff.py index f0f1b73e8b..afa83b1b22 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/html_diff.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/html_diff.py @@ -1,4 +1,6 @@ +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control from difflib import SequenceMatcher import re try: @@ -24,7 +26,7 @@ def set_seq1(self, a): def set_seq2(self, b): SequenceMatcher.set_seq2(self, self.splitHTML(b)) - + def splitTags(self, t): result = [] pos = 0 @@ -245,5 +247,3 @@ def writeLines(self, lines, out): doctest.testmod() else: print diffFiles(sys.argv[1], sys.argv[2]) - - diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/imageDashboard.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/imageDashboard.py index fa7f4113c3..dd051c5c5b 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/imageDashboard.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/imageDashboard.py @@ -7,6 +7,8 @@ from mongokit import paginator import json +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control try: from bson import ObjectId except ImportError: # old pymongo @@ -27,6 +29,7 @@ file_gst = node_collection.find_one( { "_type" : "GSystemType","name":"File" } ) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def imageDashboard(request, group_id, image_id=None,page_no=1): from gnowsys_ndf.settings import GSTUDIO_NO_OF_OBJS_PP ''' @@ -96,6 +99,7 @@ def imageDashboard(request, group_id, image_id=None,page_no=1): return render_to_response(template, variable) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def getImageThumbnail(request, group_id, _id): ''' this funciton can be called to get thumbnail of image throw url @@ -130,6 +134,7 @@ def getImageThumbnail(request, group_id, _id): return HttpResponse("") @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def getFullImage(request, group_id, _id, file_name = ""): # ins_objectid = ObjectId() # if ins_objectid.is_valid(group_id) is False : @@ -159,6 +164,7 @@ def getFullImage(request, group_id, _id, file_name = ""): return HttpResponse("") @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_mid_size_img(request, group_id, _id): # ins_objectid = ObjectId() # if ins_objectid.is_valid(group_id) is False : @@ -198,6 +204,7 @@ def get_mid_size_img(request, group_id, _id): return HttpResponse(f.read(), content_type=f.content_type) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def image_search(request,group_id): # ins_objectid = ObjectId() # if ins_objectid.is_valid(group_id) is False : @@ -225,6 +232,7 @@ def image_search(request,group_id): return render_to_response(template,variable) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def image_detail(request, group_id, _id): # ins_objectid = ObjectId() # if ins_objectid.is_valid(group_id) is False : @@ -284,6 +292,7 @@ def image_detail(request, group_id, _id): ) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def image_edit(request,group_id,_id): # ins_objectid = ObjectId() # if ins_objectid.is_valid(group_id) is False : diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/jhapp.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/jhapp.py index 3c49cdd55e..0ebf7f4003 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/jhapp.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/jhapp.py @@ -1,7 +1,9 @@ import json from django.http import HttpResponseRedirect from django.http import HttpResponse -''' -- imports from installed packages -- ''' +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control +''' -- imports from installed packages -- ''' from django.shortcuts import render_to_response from django.template import RequestContext from gnowsys_ndf.ndf.views.methods import * @@ -20,6 +22,7 @@ GST_POLICESQUAD = node_collection.one({"_type":"GSystemType","name":"PoliceSquad"}) @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def jhapp(request, group_id): try: group_id = ObjectId(group_id) @@ -37,6 +40,7 @@ def jhapp(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def uploadjhapp(request, group_id): try: @@ -47,6 +51,7 @@ def uploadjhapp(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def savejhapp(request,group_id): from gnowsys_ndf.ndf.views.file import save_file try: @@ -60,18 +65,18 @@ def savejhapp(request,group_id): usrid = request.user.id # jsmol_gst = node_collection.one({"_type":"GSystemType","name":"Jsmol" }) sel_jhapp_gst = node_collection.one({"_type":"GSystemType","name":unicode(jhapp_type_trim) }) - + import zipfile from gnowsys_ndf.ndf.views.filehive import write_files is_user_gstaff = check_is_gstaff(group_obj._id, request.user) - + fileobj_list = write_files(request, group_id) fileobj_id = fileobj_list[0]['_id'] file_node = node_collection.one({'_id': ObjectId(fileobj_id) }) - + if sel_jhapp_gst._id: file_node.member_of = [ObjectId(sel_jhapp_gst._id)] - + uploaded_files = request.FILES.getlist('filehive', []) zip_path = file_node.if_file.original['relurl'] zip_split_path = zip_path.split('.') @@ -81,7 +86,7 @@ def savejhapp(request,group_id): with zipfile.ZipFile("/data/media/"+ file_node.if_file.original['relurl'], "r") as z: z.extractall(un_zip_split_path) - + relurl_path = str("/" + un_zip_path[0] + "/" + un_zip_path[1] + "/" +un_zip_path[2] + "/" + file_name[0] + "/" + "index" + ".html" ) # print "_______________________________",relurl_path discussion_enable_at = node_collection.one({"_type": "AttributeType", "name": "discussion_enable"}) @@ -106,4 +111,4 @@ def savejhapp(request,group_id): file_node.if_file.original.relurl = relurl_path file_node.if_file.mime_type = u"text/html" file_node.save() - return HttpResponseRedirect( reverse('file_detail', kwargs={"group_id": group_id,'_id':fileobj_id})) \ No newline at end of file + return HttpResponseRedirect( reverse('file_detail', kwargs={"group_id": group_id,'_id':fileobj_id})) diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/languagepref.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/languagepref.py index 7b99b99f95..cb225df992 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/languagepref.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/languagepref.py @@ -1,5 +1,7 @@ ''' -- imports from installed packages -- ''' from django.http import HttpResponseRedirect +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control # from django.utils import translation # from django.http import HttpResponse # from django.http import StreamingHttpResponse @@ -18,6 +20,7 @@ GAPP = node_collection.one({'$and':[{'_type':'MetaType'},{'name':'GAPP'}]}) # fetching MetaType name GAPP @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def lang_pref(request): url=request.GET.get('url','') appid=request.GET.get('appid','') @@ -28,7 +31,7 @@ def lang_pref(request): lan_dict['primary']=request.LANGUAGE_CODE lan_dict['default']=u"en" auth.preferred_languages=lan_dict - if not auth.agency_type: + if not auth.agency_type: auth.agency_type = "Other" # Sets default value for agency_type as "Other" auth.modified_by=request.user.id auth.save(groupid=group_id) diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/mailclient.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/mailclient.py index 310b9205b3..ed68bf3a9d 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/mailclient.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/mailclient.py @@ -1,6 +1,8 @@ from django.core.mail import EmailMessage from django.views.generic import TemplateView from django.shortcuts import render +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control from gnowsys_ndf.ndf.models import * from gnowsys_ndf.ndf.models import node_collection, triple_collection, gridfs_collection from django.contrib.auth.models import User @@ -49,7 +51,6 @@ "Bits_Pilani": "imap.gmail.com", "Rediffmail": "pop.rediffmail.com" } - def connected_to_internet(url='http://www.google.com/', timeout=2): try: _ = requests.get(url, timeout=timeout) @@ -60,6 +61,7 @@ def connected_to_internet(url='http://www.google.com/', timeout=2): return False @login_required +@cache_control(must_revalidate=True, max_age=6) def mailclient(request, group_id): ''' This function fetches the mailboxes and the corresponding E-Mail IDs. @@ -130,6 +132,7 @@ def mailclient(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def mailbox_create_edit(request, group_id): ''' takes { @@ -245,7 +248,6 @@ def mailbox_create_edit(request, group_id): - def sorted_ls(path): ''' takes { @@ -350,7 +352,6 @@ def read_mails(path, _type, displayFrom): return mails_list - def store_mails(mails, path): ''' takes { @@ -698,6 +699,7 @@ def get_mails_in_box(mailboxname, username, mail_type, displayFrom): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def render_mailbox_pane(request,group_id): ''' This function sends the fecthed mails using 'get_mails_in_box' @@ -719,6 +721,7 @@ def render_mailbox_pane(request,group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def mailbox_edit(request, group_id,mailboxname): ''' takes { @@ -872,6 +875,7 @@ def mailbox_edit(request, group_id,mailboxname): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def mailbox_delete(request, group_id,mailboxname): ''' takes { @@ -1008,6 +1012,7 @@ def mailbox_delete(request, group_id,mailboxname): return render_to_response(template, variable) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def mailclient_error_display(request, group_id, error_obj): ''' takes { @@ -1035,6 +1040,7 @@ def mailclient_error_display(request, group_id, error_obj): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def mailbox_settings(request, group_id,mailboxname): ''' takes { @@ -1081,6 +1087,7 @@ def get_email_id(filename,mailboxname,username): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def compose_mail(request, group_id,mailboxname): ''' takes { @@ -1230,6 +1237,7 @@ def compose_mail(request, group_id,mailboxname): return render_to_response(template,variable) +@cache_control(must_revalidate=True, max_age=6) def update_mail_status(request,group_id): ''' takes { @@ -1324,6 +1332,7 @@ def update_mail_status(request,group_id): # return render(request, template, {'groupname': group_name,'groupid': group_id,'group_id': group_id, "emails" : mails_list}) return render_to_response(template,variable) +@cache_control(must_revalidate=True, max_age=6) def fetch_mail_body(request,group_id): ''' takes { @@ -1378,6 +1387,8 @@ def fetch_mail_body(request,group_id): return response # The mailBox-name must not be repeated for an individual user but other users can share the same mailBox-name + +@cache_control(must_revalidate=True, max_age=6) def unique_mailbox_name(request,group_id): ''' takes { @@ -1464,6 +1475,7 @@ def unique_mailbox_name(request,group_id): return render_to_response(template,variable) # The ID is unique to the individual user hence must not be repeated in the mailBox-data +@cache_control(must_revalidate=True, max_age=6) def unique_mailbox_id(request,group_id): ''' takes { diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/meeting.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/meeting.py index 57259fcf24..9339e7315f 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/meeting.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/meeting.py @@ -7,6 +7,8 @@ from django.contrib.sites.models import Site from django.shortcuts import render_to_response # , render from django.template import RequestContext +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control # from django.template import Context # from django.template.defaultfilters import slugify # from django.template.loader import get_template @@ -48,6 +50,7 @@ ################## @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def output(request, group_id, meetingid): newmeetingid = meetingid ins_objectid = ObjectId() @@ -69,6 +72,7 @@ def output(request, group_id, meetingid): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def dashb(request, group_id): #ramkarnani """Renders a list of all 'Page-type-GSystems' available within the database. """ @@ -101,6 +105,7 @@ def dashb(request, group_id): #### Ajax would be called here to get refreshed list of online members @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_online_users(request, group_id): #ramkarnani """Json of online users, useful f.ex. for refreshing a online users list via an ajax call or something""" online_users = cache.get(CACHE_USERS) @@ -110,6 +115,7 @@ def get_online_users(request, group_id): #print type(a) return HttpResponse(simplejson.dumps(online_users, default=encode_json)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def invite_meeting(request, group_id, meetingid): #ramkarnani try: # print "here in view" diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/methods.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/methods.py index 6820bd59ec..268c123549 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/methods.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/methods.py @@ -323,24 +323,18 @@ def capture_data(file_object=None, file_data=None, content_type=None,time=None): def get_group_name_id(group_name_or_id, get_obj=False): ''' - This method takes possible group name/id as an argument and returns (group-name and id) or group object. - - If no second argument is passed, as method name suggests, returned result is "group_name" first and "group_id" second. - - When we need the entire group object, just pass second argument as (boolian) True. In the case group object will be returned. - Example 1: res_group_name, res_group_id = get_group_name_id(group_name_or_id) - "res_group_name" will contain name of the group. - "res_group_id" will contain _id/ObjectId of the group. - Example 2: res_group_obj = get_group_name_id(group_name_or_id, get_obj=True) - "res_group_obj" will contain entire object. - Optimization Tip: before calling this method, try to cast group_id to ObjectId as follows (or copy paste following snippet at start of function or wherever there is a need): try: group_id = ObjectId(group_id) except: group_name, group_id = get_group_name_id(group_id) - ''' # if cached result exists return it if not get_obj: @@ -668,7 +662,6 @@ def get_all_resources_for_group(group_id): @get_execution_time def get_gapps(default_gapp_listing=False, already_selected_gapps=[]): """Returns list of GApps. - Arguments: default_gapp_listing -- (Optional argument) - This is to decide which list should be considered for listing GAPPs; @@ -677,13 +670,11 @@ def get_gapps(default_gapp_listing=False, already_selected_gapps=[]): - At present used in listing GAPPS whenever a new group is created - False: GSTUDIO_WORKING_GAPPS (selection-menu) - At present used in listing GAPPS for setting-up GAPPS for a group - already_selected_gapps -- (Optional argument) - List of GApps already set for a given group in form of dictionary variable - If specified, then these listed GApps are excluded from the list of GApps returned by this function - Returns: - List of GApps where each GApp is in form of node/dictionary """ @@ -1327,12 +1318,10 @@ def get_node_common_fields(request, node, group_id, node_type, coll_set=None): ''' if node.content_org != content_org: node.content_org = unicode(content_org) - # Required to link temporary files with the current user who is # modifying this document usrname = request.user.username filename = slugify(name) + "-" + slugify(usrname) + "-" + ObjectId().__str__() - node_page_type_list = [] if node.get("_id",None): get_node = node_collection.one({'_id': ObjectId(node._id)}) @@ -1341,7 +1330,6 @@ def get_node_common_fields(request, node, group_id, node_type, coll_set=None): for each_node_type_of in node_type_of: node_type_of_name = node_collection.one({'_id': each_node_type_of}) node_page_type_list.append(node_type_of_name.name) - # org editor for wiki page and ckeditor for blog and info pages if node_page_type_list: if "Wiki page" in node_page_type_list: @@ -2154,7 +2142,6 @@ def get_node_metadata(request, node, **kwargs): Pass is_changed=True as last/third argument while calling this/get_node_metadata method. Example: updated_ga_nodes = get_node_metadata(request, node_obj, GST_FILE_OBJ, is_changed=True) - ''' attribute_type_list = ["age_range", "audience", "timerequired", "interactivitytype", "basedonurl", "educationaluse", @@ -2411,11 +2398,9 @@ def get_property_order_with_value(node): def parse_template_data(field_data_type, field_value, **kwargs): """ Parses the value fetched from request (GET/POST) object based on the data-type of the given field. - Arguments: field_data_type -- data-type of the field field_value -- value of the field retrieved from GET/POST object - Returns: Parsed value based on the data-type of the field """ @@ -2656,7 +2641,6 @@ def _update_attr_set(attr_set_list_of_dicts, attr_key, attr_value): object_scope : unicode, subject_scope : unicode } - ''' if ga_node is None: @@ -2841,18 +2825,15 @@ def _update_attr_set(attr_set_list_of_dicts, attr_key, attr_value): def create_grelation(subject_id, relation_type_node, right_subject_id_or_list, **kwargs): """Creates single or multiple GRelation documents (instances) based on given RelationType's cardinality (one-to-one / one-to-many). - Arguments: subject_id -- ObjectId of the subject-node relation_type_node -- Document of the RelationType node (Embedded document) right_subject_id_or_list -- - When one to one relationship: Single ObjectId of the right_subject node - When one to many relationship: List of ObjectId(s) of the right_subject node(s) - Returns: - When one to one relationship: Created/Updated/Existed document. - When one to many relationship: Created/Updated/Existed list of documents. - kwargs -- can hold the scope value """ gr_node = None @@ -2867,7 +2848,6 @@ def create_grelation(subject_id, relation_type_node, right_subject_id_or_list, * object_scope : unicode, subject_scope : unicode } - In next phase, validate the scope values by adding: GSTUDIO_FORMAT_SCOPE_VALUES GSTUDIO_SIZE_SCOPE_VALUES @@ -3595,11 +3575,9 @@ def get_file_node(file_name=""): @get_execution_time def create_task(task_dict, task_type_creation="single"): """Creates task with required attribute(s) and relation(s). - task_dict - Required keys: _id[optional], name, group_set, created_by, modified_by, contributors, content_org, created_by_name, Status, Priority, start_time, end_time, Assignee, has_type - task_type_creation - Valid input values: "single", "multiple", "group" """ @@ -3739,20 +3717,17 @@ def create_task(task_dict, task_type_creation="single"): @get_execution_time def get_student_enrollment_code(college_id, node_id_to_ignore, registration_date, college_group_id=None): """Returns new student's enrollment code - Enrollment Code is combination of following values: Code: (MH/SNG/15/xxxx) - 2-letters state code - 3-letters college code - 2-digits year of registration - 4-digits Auto-generated No. - Arguments: college_id: ObjectId of college's node node_id_to_ignore: ObjectId of the student node for which this function generates enrollment_code registration_date: Date of registration of student node for which this function generates enrollment_code college_group_id [Optional]: ObjectId of college's group node - Returns: Newly created enrollment code for student node """ @@ -3928,12 +3903,9 @@ def create_college_group_and_setup_data(college_node): """ Creates private group for given college; establishes relationship between them via "has_group" RelationType. - Also populating data into it needed for registrations. - Arguments: college_node -- College node (or document) - Returns: College group node GRelation node @@ -4152,7 +4124,6 @@ def parse_data(doc): def delete_gattribute(subject_id=None, deletion_type=0, **kwargs): """This function deletes GAttribute node(s) of Triples collection. - Keyword arguments: subject_id -- (Optional argument) - Specify this argument if you need to delete/purge GAttribute(s) @@ -4160,7 +4131,6 @@ def delete_gattribute(subject_id=None, deletion_type=0, **kwargs): - ObjectId of the node whose GAttribute node(s) need(s) to be deleted, accepted in either format String or ObjectId - Default value is set to None - kwargs["node_id"] -- (Optional argument) - Specify this argument if you need to delete/purge only a given GAttribute node @@ -4169,7 +4139,6 @@ def delete_gattribute(subject_id=None, deletion_type=0, **kwargs): - If this argument is specified, subject_id will work as an optional argument and even query variable would be overridden by node_id's query variable - deletion_type -- (Optional argument) - Specify this to signify which type of deletion you need to perform - Accepts only either of the following values: @@ -4179,21 +4148,17 @@ def delete_gattribute(subject_id=None, deletion_type=0, **kwargs): (b) 1 (one, i.e. Purge) - Process in which node is deleted from the database - Default value is set to 0 (zero) - Returns: A tuple with following values: First-element: Boolean value Second-element: Message - If deletion is successful, then (True, "Success message.") Otherwise, (False, "Error message !") - Examples: del_status, del_status_msg = delete_attribute( subject_id=ObjectId("...") [, deletion_type=0[/1]] ) - del_status, del_status_msg = delete_attribute( node_id=ObjectId("...") [, deletion_type=0[/1]] @@ -4388,7 +4353,6 @@ def delete_gattribute(subject_id=None, deletion_type=0, **kwargs): def delete_grelation(subject_id=None, deletion_type=0, **kwargs): """This function deletes GRelation node(s) of Triples collection. - Keyword arguments: subject_id -- (Optional argument) - Specify this argument if you need to delete/purge GRelation(s) @@ -4396,7 +4360,6 @@ def delete_grelation(subject_id=None, deletion_type=0, **kwargs): - ObjectId of the node whose GRelation node(s) need(s) to be deleted, accepted in either format String or ObjectId - Default value is set to None - kwargs["node_id"] -- (Optional argument) - Specify this argument if you need to delete/purge only a given GRelation node @@ -4405,7 +4368,6 @@ def delete_grelation(subject_id=None, deletion_type=0, **kwargs): - If this argument is specified, subject_id will work as an optional argument and even query variable would be overridden by node_id's query variable - deletion_type -- (Optional argument) - Specify this to signify which type of deletion you need to perform - Accepts only either of the following values: @@ -4415,21 +4377,17 @@ def delete_grelation(subject_id=None, deletion_type=0, **kwargs): (b) 1 (one, i.e. Purge) - Process in which node is deleted from the database - Default value is set to 0 (zero) - Returns: A tuple with following values: First-element: Boolean value Second-element: Message - If deletion is successful, then (True, "Success message.") Otherwise, (False, "Error message !") - Examples: del_status, del_status_msg = delete_grelation( subject_id=ObjectId("...") [, deletion_type=0[/1]] ) - del_status, del_status_msg = delete_grelation( node_id=ObjectId("...") [, deletion_type=0[/1]] @@ -4671,7 +4629,6 @@ def delete_node( deletion_type=0, **kwargs): """This function deletes node belonging to either Nodes collection or Triples collection. - Keyword Arguments: node_id -- (Optional argument) - Specify this argument if you need to delete/purge only a given @@ -4683,7 +4640,6 @@ def delete_node( - If this argument is ignored, then you must specify subject_id as a parameter (mandatory in case of deleting node from Triples collection). - Default value is set to None - collection_name -- (Optional argument) - Specify this to signify from which collection you need to delete node i.e. helpful in setting-up the collection-variable @@ -4692,7 +4648,6 @@ def delete_node( (a) node_collection.collection_name/"Nodes" (b) triple_collection.collection_name/"Triples" - Default set to node_collection.collection_name (i.e. "Nodes") - deletion_type -- (Optional argument) - Specify this to signify which type of deletion you need to perform - Accepts only either of the following values: @@ -4702,29 +4657,24 @@ def delete_node( (b) 1 (one, i.e. Purge) - Process in which node is deleted from the database - Default value is set to 0 (zero) - kwargs["subject_id"] -- (Optional argument) - Specify this argument if you need to delete/purge GRelation(s) and/or GAttribute(s) related to given node belonging to Nodes collection - ObjectId of the node whose GAttribute(s) and/or GRelation node(s) need(s) to be deleted, accepted in either format String or ObjectId - Default value is set to None - kwargs["_type"] -- (Optional argument) - Specify this argument if you need to delete/purge specifically either only GAttribute node(s) or GRelation node(s) - If ignored, then by default node(s) belonging to both types (GAttribute and GRelation) will be considered for deleting/purging - Can also be specified in case of delete/purge Nodes collection node - Returns: A tuple with following values: First-element: Boolean value Second-element: Message - If deletion is successful, then (True, "Success message.") Otherwise, (False, "Error message !") - If you need to delete node of Nodes collection, then you only need to specify node_id, collection_name, and deletion_type as parameters. Examples: @@ -4733,7 +4683,6 @@ def delete_node( [, collection_name=node_collection.collection_name] [, deletion_type=0[/1]] ) - If you need to delete node(s) of Triples collection, then you need to specify node_id/subject_id [depending on whether you need to delete single node or multiple nodes which are related to given node of Nodes collection] @@ -5168,13 +5117,11 @@ def create_thread_for_node(request, group_id, node): Accepts: * ObjectId of group. * node - Page/File GSystem - Actions: * Finds the thread_node associated with passed node. * Creates ATs release_response and thread_interaction_type for thread_node * If dates set for thread, created ATs start_time and end_time for thread_node * Creates RT has_thread between node and thread_node - Returns: * Success - True/False """ @@ -5194,11 +5141,9 @@ def node_thread_access(group_id, node): Accepts: * ObjectId of group. * node - Page/File GSystem - Actions: * Finds the thread_node associated with passed node. * Validation for discussion based on start_time and end_time, if exists - Returns: * thread_node - used in discussion.html * success (i.e True/False) @@ -5245,10 +5190,8 @@ def node_thread_access(group_id, node): def get_prior_node_hierarchy(oid): """pass the node's ObjectId and get list of objects in hierarchy - Args: oid (TYPE): mongo ObjectId - Returns: list: List of objects starts from passed node till top node """ @@ -5275,10 +5218,8 @@ def get_language_tuple(lang): """ from input argument of language code of language name get the std matching tuple from settings. - Returns: tuple: (, ) - Args: lang (str or unicode): it is the one of item from tuple. It may either language-code or language-name. @@ -5309,14 +5250,10 @@ def get_filter_querydict(filters): After getting the filters from request, this method converts it into mongo query-able. suitable form. Which can be passed to '$and'. - Args: filter (JSON): It's a nested list of '$or' dicts. e.g: [{"$or":[{"selFieldValue":"educationallevel","selFieldValueAltnames":"Level","selFieldGstudioType":"attribute","selFieldText":"Upper Primary","selFieldPrimaryType":"list"},{"selFieldValue":"educationallevel","selFieldValueAltnames":"Level","selFieldGstudioType":"attribute","selFieldText":"Primary","selFieldPrimaryType":"list"}]},{"$or":[{"selFieldValue":"interactivitytype","selFieldValueAltnames":"interactivitytype","selFieldGstudioType":"attribute","selFieldText":"Expositive","selFieldPrimaryType":"basestring"}]}] - - - Returns: JSON: JSON format which can be directly feed to query. e.g: @@ -5495,13 +5432,10 @@ def dig_nodes_field(parent_node, field_name="collection_set", This function fetches list of ObjectIds by digging into the node's field_name and the result's field_name recursively. - 'field_name' can be collection_set/prior_node/post_node etc. 'member_of' is a list of GST names e.g ['Page', 'File'] - If 'only_leaf_nodes' is True, the leaf nodes will be fetched, i.e the nodes not having any value in their said field_name - To invoke this function: result = dig_nodes_field(node_obj)/ result = dig_nodes_field(node_obj,'collection_set')/ @@ -5623,14 +5557,12 @@ def get_course_completetion_status(group_obj, user_id,ids_list=False): partially_exists = any(each_id in completed_ids for each_id in cu_node.collection_set) if partially_exists: incompleted_ids.append(cu_node._id) - if all(each_item in completed_ids for each_item in css_node.collection_set): completed_ids.append(css_node._id) else: partially_exists = any(each_id in completed_ids for each_id in css_node.collection_set) if partially_exists or all(each_item in incompleted_ids for each_item in css_node.collection_set): incompleted_ids.append(css_node._id) - if all(each_item in completed_ids for each_item in cs_node.collection_set): completed_ids.append(cs_node._id) else: diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/migrate_users.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/migrate_users.py index f03c276bf0..0ac6850587 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/migrate_users.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/migrate_users.py @@ -5,7 +5,8 @@ from gnowsys_ndf.notification import models as notification from django.contrib.sites.models import Site from django.template.loader import render_to_string - +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control def migrate(): """ test """ fp=open("cube_users","r") diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/mis.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/mis.py index 129328f788..22eea70dd5 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/mis.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/mis.py @@ -14,6 +14,9 @@ from django.core.urlresolvers import reverse from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control + # from mongokit import paginator try: @@ -34,6 +37,7 @@ @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def mis_detail(request, group_id, app_id=None, app_set_id=None, app_set_instance_id=None, app_name=None): """ custom view for custom GAPPS @@ -350,6 +354,7 @@ def mis_detail(request, group_id, app_id=None, app_set_id=None, app_set_instance @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def mis_create_edit(request, group_id, app_id, app_set_id=None, app_set_instance_id=None, app_name=None): """ create new instance of app_set of apps view for custom GAPPS @@ -805,6 +810,7 @@ def multi_8(lst):#Function used by Processes implemented below @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def mis_enroll(request, group_id, app_id, app_set_id=None, app_set_instance_id=None, app_name=None): """ Redirects to student_enroll function of person-view. @@ -841,6 +847,7 @@ def mis_enroll(request, group_id, app_id, app_set_id=None, app_set_instance_id=N @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def get_mis_reports(request, group_id, **kwargs): title = "Reports" group_name, group_id = get_group_name_id(group_id) diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/moderation.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/moderation.py index 94cdd13cf7..3f9dbd5442 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/moderation.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/moderation.py @@ -14,7 +14,8 @@ from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User from django.views.generic import View - +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control try: from bson import ObjectId except ImportError: # old pymongo @@ -35,6 +36,7 @@ @login_required +@cache_control(must_revalidate=True, max_age=6) def moderation_status(request, group_id, node_id, get_only_response_dict=False): try: @@ -150,7 +152,7 @@ def moderation_status(request, group_id, node_id, get_only_response_dict=False): return response_dict return render_to_response('ndf/under_moderation.html', response_dict, RequestContext(request)) - +@cache_control(must_revalidate=True, max_age=6) def all_under_moderation(request, group_id): from gnowsys_ndf.ndf.views.group import CreateModeratedGroup, CreateEventGroup, CreateGroup @@ -196,6 +198,7 @@ def all_under_moderation(request, group_id): raise Http404('Group is not EDITABLE_MODERATED') @login_required +@cache_control(must_revalidate=True, max_age=6) def moderation(request, group_id, page_no=1): # try: # group_id = ObjectId(group_id) @@ -212,6 +215,7 @@ def moderation(request, group_id, page_no=1): @login_required +@cache_control(must_revalidate=True, max_age=6) def approve_resource(request, group_id): ''' Method to approve resorce. diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/module.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/module.py index d1df025328..cf0841619a 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/module.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/module.py @@ -12,6 +12,8 @@ from django.template import RequestContext from django.contrib.auth.decorators import login_required from django.core.urlresolvers import reverse +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control ''' -- imports from application folders/files -- ''' from gnowsys_ndf.ndf.models import GSystemType, Group, Node, GSystem #, Triple @@ -30,6 +32,7 @@ @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def list_modules(request, group_id): ''' listing of modules @@ -51,6 +54,7 @@ def list_modules(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def module_create_edit(request, group_id, module_id=None, cancel_url='list_modules'): if request.method == "GET": @@ -101,6 +105,7 @@ def module_create_edit(request, group_id, module_id=None, cancel_url='list_modul @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def module_detail(request, group_id, node_id,title=""): ''' detail of of selected module @@ -209,6 +214,7 @@ def module_detail(request, group_id, node_id,title=""): context_instance=RequestContext(request)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def unit_order_list(request, group_id, node_id): response_dict = {"success": False} unit_id_list = request.POST.get('unit_list', []) diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/node.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/node.py index cd1d69e3a7..e1a32e3ae0 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/node.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/node.py @@ -14,6 +14,8 @@ from django.contrib.auth.decorators import login_required from django.core.urlresolvers import reverse from gnowsys_ndf.settings import GSTUDIO_BUDDY_LOGIN, GSTUDIO_NOTE_CREATE_POINTS +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control ''' -- imports from application folders/files -- ''' from gnowsys_ndf.ndf.models import GSystemType, Group, Node, GSystem, Buddy, Counter #, Triple @@ -27,6 +29,7 @@ @login_required @auto_enroll @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def node_create_edit(request, group_id=None, member_of=None, diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/notify.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/notify.py index a3afd601e6..19b1d15503 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/notify.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/notify.py @@ -5,7 +5,8 @@ from django.contrib.auth.models import User from django.template.loader import render_to_string from django.contrib.sites.models import Site - +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control from gnowsys_ndf.ndf.models import Node, Counter from gnowsys_ndf.ndf.models import node_collection, triple_collection from gnowsys_ndf.ndf.templatetags.ndf_tags import get_all_user_groups @@ -47,6 +48,7 @@ def set_notif_val(request,group_id,msg,activ,bx): # Send invitation to any user to join or unsubscribe @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def send_invitation(request,group_id): # Send invitation to any user to join or unsubscribe try: @@ -99,6 +101,7 @@ def notifyuser(request,group_id): return HttpResponse("failure") @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def notify_remove_user(request,group_id): colg = node_collection.one({'_id': ObjectId(group_id)}) groupname=colg.name @@ -115,6 +118,7 @@ def notify_remove_user(request,group_id): return HttpResponse("failure") @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def invite_users(request,group_id): try: sending_user=request.user @@ -194,6 +198,7 @@ def invite_users(request,group_id): return HttpResponse("Failure") @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def invite_admins(request,group_id): #inorder to be a group admin, the user must be member of that group try: diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/observation.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/observation.py index dab8d31f4f..8ff394a041 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/observation.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/observation.py @@ -12,7 +12,8 @@ from django.template import RequestContext from django.template.defaultfilters import slugify from django.contrib.auth.decorators import login_required - +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control try: from bson import ObjectId except ImportError: # old pymongo @@ -31,6 +32,7 @@ @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def all_observations(request, group_id, app_id=None): ins_objectid = ObjectId() @@ -115,6 +117,7 @@ def all_observations(request, group_id, app_id=None): context_instance=RequestContext(request) ) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def observations_app(request, group_id, app_id=None, app_name=None, app_set_id=None, slug=None): ins_objectid = ObjectId() @@ -209,6 +212,7 @@ def observations_app(request, group_id, app_id=None, app_name=None, app_set_id=N ) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def save_observation(request, group_id, app_id=None, app_name=None, app_set_id=None, slug=None): user_type = request.POST["user"] user_session_id = request.POST["user_session_id"] @@ -294,6 +298,7 @@ def save_observation(request, group_id, app_id=None, app_name=None, app_set_id=N @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def delete_observation(request, group_id, app_id=None, app_name=None, app_set_id=None, slug=None): user_type = request.POST["user"] @@ -342,6 +347,7 @@ def delete_observation(request, group_id, app_id=None, app_name=None, app_set_id return StreamingHttpResponse(response_data) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def save_image(request, group_id, app_id=None, app_name=None, app_set_id=None, slug=None): if request.method == "POST" : diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/organization.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/organization.py index 4ea1c1bb81..110fff48f8 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/organization.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/organization.py @@ -10,6 +10,8 @@ from django.template import TemplateDoesNotExist from django.core.urlresolvers import reverse from django.contrib.auth.decorators import login_required +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control try: from bson import ObjectId @@ -30,6 +32,7 @@ @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def organization_detail(request, group_id, app_id=None, app_set_id=None, app_set_instance_id=None, app_name=None): """ custom view for custom GAPPS @@ -235,6 +238,7 @@ def organization_detail(request, group_id, app_id=None, app_set_id=None, app_set @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def organization_create_edit(request, group_id, app_id, app_set_id=None, app_set_instance_id=None, app_name=None): """ Creates/Modifies document of given organization-type. diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/page.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/page.py index 7fd766bb4d..e7d2efde31 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/page.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/page.py @@ -15,6 +15,9 @@ from django.template import RequestContext from django.template.defaultfilters import slugify from django.utils.translation import ugettext +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control + from mongokit import paginator try: from bson import ObjectId @@ -55,6 +58,7 @@ @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def page(request, group_id, app_id=None,page_no=1): """Renders a list of all 'Page-type-GSystems' available within the database. """ @@ -183,6 +187,7 @@ def page(request, group_id, app_id=None,page_no=1): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def create_edit_page(request, group_id, node_id=None): """Creates/Modifies details about the given quiz-item. """ @@ -416,6 +421,7 @@ def create_edit_page(request, group_id, node_id=None): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def delete_page(request, group_id, node_id): """Change the status to Hidden. @@ -443,6 +449,7 @@ def delete_page(request, group_id, node_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def translate_node(request,group_id,node_id=None): """ translate the node content""" # ins_objectid = ObjectId() @@ -523,6 +530,7 @@ def translate_node(request,group_id,node_id=None): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def publish_page(request,group_id,node): # ins_objectid = ObjectId() # if ins_objectid.is_valid(group_id) is False : diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/partner.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/partner.py index 53812210a2..9aa4561ff6 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/partner.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/partner.py @@ -11,6 +11,8 @@ # from django.template.defaultfilters import slugify from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control try: from bson import ObjectId @@ -42,6 +44,7 @@ @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def create_partner(request,group_id): # ins_objectid = ObjectId() # if ins_objectid.is_valid(group_id) is False : @@ -134,7 +137,7 @@ def create_partner(request,group_id): nodes_list.append(str((each.name).strip().lower())) return render_to_response("ndf/create_partner.html", {'groupid': group_id, 'group_obj':group_obj,'appId': app._id, 'group_id': group_id, 'nodes_list': nodes_list},RequestContext(request)) - +@cache_control(must_revalidate=True, max_age=6) def partner_list(request, group_id): group_obj = get_group_name_id(group_id, get_obj=True) @@ -166,6 +169,7 @@ def partner_list(request, group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def nroer_groups(request, group_id, groups_category): group_name, group_id = get_group_name_id(group_id) @@ -213,7 +217,7 @@ def nroer_groups(request, group_id, groups_category): }, context_instance=RequestContext(request)) - +@cache_control(must_revalidate=True, max_age=6) def partner_showcase(request, group_id): group_name, group_id = get_group_name_id(group_id) diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/person.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/person.py index f341caf104..213222c250 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/person.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/person.py @@ -11,6 +11,8 @@ from django.template import TemplateDoesNotExist from django.core.urlresolvers import reverse from django.contrib.auth.decorators import login_required +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control from mongokit import IS @@ -32,6 +34,7 @@ @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def person_detail(request, group_id, app_id=None, app_set_id=None, app_set_instance_id=None, app_name=None): """ custom view for custom GAPPS @@ -350,6 +353,7 @@ def person_detail(request, group_id, app_id=None, app_set_id=None, app_set_insta @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def person_create_edit(request, group_id, app_id, app_set_id=None, app_set_instance_id=None, app_name=None): """ Creates/Modifies document of given person-type. diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/program.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/program.py index 019e34a5c4..9059db6395 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/program.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/program.py @@ -14,6 +14,8 @@ from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required from django.contrib.sites.models import Site +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control try: from bson import ObjectId except ImportError: # old pymongo @@ -24,7 +26,7 @@ from gnowsys_ndf.ndf.models import node_collection from gnowsys_ndf.ndf.views.methods import get_group_name_id, get_prior_node_hierarchy from gnowsys_ndf.ndf.templatetags.ndf_tags import check_is_gstaff - +@cache_control(must_revalidate=True, max_age=6) def program_event_list(request, group_id): """ * Renders a list of all 'programs' @@ -81,4 +83,4 @@ def program_event_list(request, group_id): 'enr_ce_coll':enr_ce_coll, }, context_instance=RequestContext(request) - ) \ No newline at end of file + ) diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/quiz.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/quiz.py index 9d4f5a96e8..270207d25f 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/quiz.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/quiz.py @@ -10,6 +10,8 @@ from django.shortcuts import render_to_response # , render from django.template import RequestContext from django.template.defaultfilters import slugify +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control import json try: @@ -52,6 +54,7 @@ # V I E W S D E F I N E D F O R G A P P -- ' Q U I Z ' ############################################################################## @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def quiz(request, group_id): """Renders a list of all 'Quiz-type-GSystems' available within the database. """ @@ -84,6 +87,7 @@ def quiz(request, group_id): ) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def quiz_item_detail(request, group_id, node_id=None): try: group_id = ObjectId(group_id) @@ -98,7 +102,6 @@ def quiz_item_detail(request, group_id, node_id=None): variable, context_instance=RequestContext(request)) - def created_trans_node(request, group_id, node_id, trans_node_id, language): rt_translation_of = Node.get_name_id_from_type('translation_of', 'RelationType', get_obj=True) trans_node_gst_name, trans_node_gst_id = GSystemType.get_gst_name_id("trans_node") @@ -128,7 +131,6 @@ def created_trans_node(request, group_id, node_id, trans_node_id, language): translate_grel = create_grelation(node_id, rt_translation_of, trans_grel_list, language=language) return translated_node - def get_quiz_item_name_content(request): question_name = request.POST.get('quiz_item_name',u'Untitled') question_content = request.POST.get('content_org',u'Untitled') @@ -155,6 +157,7 @@ def options_attachment(request, quiz_item_node, language): @login_required +@cache_control(must_revalidate=True, max_age=6) def create_edit_quiz_item(request, group_id, node_id=None, trans_node_id=None, lang='en'): """Creates/Modifies details about the given quiz-item. """ @@ -342,6 +345,7 @@ def create_edit_quiz_item(request, group_id, node_id=None, trans_node_id=None, l @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def create_edit_quiz(request, group_id, node_id=None): """Creates/Edits quiz category. """ @@ -390,6 +394,7 @@ def create_edit_quiz(request, group_id, node_id=None): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def quiz_details(request, group_id, node_id): try: group_id = ObjectId(group_id) @@ -415,6 +420,7 @@ def quiz_details(request, group_id, node_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def save_quizitem_answer(request, group_id): response_dict = {"success": False} try: @@ -654,7 +660,6 @@ def save_quizitem_response(user_id, quiz_type_val, user_action, user_given_ans, pass print "\nError occurred in save_quizitem_response(). ", save_quizitem_response_err return old_submitted_ans, user_ans, new_list - def get_quiz_item_options(node): options_list = [] try: @@ -671,7 +676,7 @@ def get_quiz_item_options(node): print "\nError in get_quiz_item_options(). Error: ", get_quiz_item_options_err # print "\noptions_list: ", options_list return options_list - +@cache_control(must_revalidate=True, max_age=6) def render_quiz_player(request, group_id, node, get_context=False): try: if gst_quiz_item._id not in node.member_of or gst_quiz_item_event._id not in node.member_of: diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/ratings.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/ratings.py index e9aab7f186..938911171b 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/ratings.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/ratings.py @@ -1,6 +1,9 @@ from django.contrib.auth.models import User from django.contrib.sites.models import Site from django.contrib.auth.decorators import login_required +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control + from django.http import HttpResponseRedirect from django.http import HttpResponse from django.core.urlresolvers import reverse @@ -25,6 +28,7 @@ @get_execution_time @login_required @auto_enroll +@cache_control(must_revalidate=True, max_age=6) def ratings(request, group_id, node_id): rating_given = request.POST.get('rating', '') diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/rpc_resources.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/rpc_resources.py index 58f92895cf..76b7929728 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/rpc_resources.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/rpc_resources.py @@ -2,7 +2,8 @@ import json from jsonrpc import jsonrpc_method from django.contrib.auth.models import User - +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control from mongokit import paginator try: @@ -19,7 +20,6 @@ ####################################################################################################################################### - @jsonrpc_method('resources', safe=True) def resources_list(request): ''' @@ -87,7 +87,6 @@ def resources_list(request): # print "\n",json.dumps(ebooks_dict),"\n" return json.dumps(ebooks_dict) - @get_execution_time def get_metadata(efile): ''' diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/search_views.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/search_views.py index d640df1e23..e3fa198cb6 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/search_views.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/search_views.py @@ -3,6 +3,8 @@ from gnowsys_ndf.ndf.models import * from gnowsys_ndf.ndf.views.methods import get_execution_time,create_gattribute, create_grelation, get_group_name_id from django.template import RequestContext +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control #from stemming.porter2 import stem try: @@ -42,6 +44,7 @@ def default(self, obj): # DISPLAYS THE SEARCH PAGE - USEFUL ONLY IF COMING TO THE SEARCH PAGE FROM THE OUTSIDE +@cache_control(must_revalidate=True, max_age=6) def search_page(request, group_id): # ins_objectid = ObjectId() # if ins_objectid.is_valid(group_id) is False : @@ -101,6 +104,7 @@ def getRenderableContext(group_id): # VIEW FOR KEYWORD SEARCH +@cache_control(must_revalidate=True, max_age=6) def search_query(request, group_id): col = get_database()[Node.collection_name] @@ -150,6 +154,7 @@ def search_query(request, group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def results_search(request, group_id, page_no=1, return_only_dict = None): """ This view returns the results for global search on all GSystems by name, tags and contents. @@ -522,6 +527,7 @@ def results_search(request, group_id, page_no=1, return_only_dict = None): # KEYWORD SEARCH FOR A SPECIFIC GROUP +@cache_control(must_revalidate=True, max_age=6) def results_search_group(request, group_id): """ This view returns the results for search on all GSystems by name, tags and contents in the group currently chosen. @@ -797,7 +803,7 @@ def results_search_group(request, group_id): # return render(request, 'ndf/advanced_search2.html', {"allGSystems":allGSystems, "groupid":group_id, "allGroups":allGroups, "allUsers":allUsers, "group_id":group_id}) - +@cache_control(must_revalidate=True, max_age=6) def get_attributes(request, group_id): attributes = [] @@ -833,7 +839,6 @@ def get_attributes(request, group_id): #print attributes return HttpResponse(json.dumps(attributes, cls=Encoder)) - def user_name_to_id(userNames): allUsers = [] for user in userNames: @@ -842,7 +847,6 @@ def user_name_to_id(userNames): return allUsers - def group_name_to_id(groupNames): allGroups = [] @@ -853,7 +857,7 @@ def group_name_to_id(groupNames): return allGroups - +@cache_control(must_revalidate=True, max_age=6) def advanced_search_results(request, group_id): # READ THE GET VALUES @@ -958,7 +962,6 @@ def advanced_search_results(request, group_id): return render(request, 'ndf/search_page.html', context_to_return) - def get_public_groups(): cur = node_collection.find({"_type": "Group", "group_type": "PUBLIC"}, {"name": 1}) allGroups = [] @@ -967,7 +970,6 @@ def get_public_groups(): return allGroups - def addType(obj): ##print "received: ", obj.member_of[0] #i = ObjectId(obj.member_of[0]) @@ -990,7 +992,6 @@ def addType(obj): #print "obj", obj2 return obj2 - def sort_names_by_similarity(exact_match, search_str_user): matches = [] # TO STORE A LIST OF SORTED MATCH PERCENTAGE final_list = [] # FINAL LIST OF SORTED OBJECTS @@ -1014,7 +1015,6 @@ def sort_names_by_similarity(exact_match, search_str_user): return final_list - def removeArticles(text): words = text.split() articles=['a', 'an', 'and', 'the', 'i', 'is', 'this', 'that', 'there', 'here', 'am', 'on', 'at', 'of', 'where'] @@ -1024,11 +1024,9 @@ def removeArticles(text): words = removeDuplicateWords(words) return words - def removeDuplicateWords(words): return list(OrderedDict.fromkeys(words)) - def stemWords(words, search_str_user): stemmed = [] l = len(words) @@ -1078,7 +1076,7 @@ def populate_list_of_group_members(group_ids): return memList - +@cache_control(must_revalidate=True, max_age=6) def get_users(request, group_id): group_ids = str(request.GET['Groups']) group_ids = group_ids.split(",") @@ -1092,7 +1090,7 @@ def get_users(request, group_id): allUsers = populate_list_of_group_members(group_ids) return HttpResponse(json.dumps(allUsers, cls=Encoder)) - +@cache_control(must_revalidate=True, max_age=6) def get_node_info(request, group_id, node_name): # ins_objectid = ObjectId() @@ -1154,7 +1152,7 @@ def get_node_info(request, group_id, node_name): return render(request, 'ndf/node_details.html', {'is_list':0, 'list_nodes':'', 'all_fields':results, 'groupid':group_id}) - +@cache_control(must_revalidate=True, max_age=6) def get_node_info2(request, group_id, node_id): """ This view displays the info about a node - the basic fields - name, created_by, last_update as well as all the GAttributes. @@ -1204,7 +1202,7 @@ def get_node_info2(request, group_id, node_id): results = json.dumps(results, cls=Encoder) return render(request, 'ndf/node_details.html', {'is_list':0, 'list_nodes':'', 'all_fields':results, 'groupid':group_id}) - +@cache_control(must_revalidate=True, max_age=6) def get_relations_for_autoSuggest(request, group_id): """ This function returns a list of names of RelationsTypes, GSystemTypes and GSYstems in the database according to the search query already typed by the user. @@ -1246,7 +1244,7 @@ def get_relations_for_autoSuggest(request, group_id): # return render(request, 'ndf/ra_search.html', {"groupid":group_id}) - +@cache_control(must_revalidate=True, max_age=6) def ra_search_results(request, group_id): """ This function implements the graph search. @@ -1568,7 +1566,6 @@ def ra_search_results(request, group_id): return render(request, 'ndf/search_page.html', context_to_return) - def get_max_match(sorted_rel, word_reqd, max_length): """ Helper function for the graph search function. @@ -1604,7 +1601,6 @@ def get_max_match(sorted_rel, word_reqd, max_length): #######################################################SEMANTIC SEARCH 8TH JULY######################################################## ################################### PRE PROCESSING FOR MAP REDUCE ################################################################# - def pre_process_for_map_reduce(text): grammar = r""" @@ -1623,7 +1619,6 @@ def pre_process_for_map_reduce(text): terms = get_terms(tree) return terms - def leaves(tree): """Finds NP (nounphrase) leaf nodes of a chunk tree.""" for subtree in tree.subtrees(filter = lambda t: t.node == 'NP'): @@ -1656,7 +1651,6 @@ def acceptable_word(word): max_word_length = 40 accepted = bool(2 <= len(word) <= max_word_length and word.lower() not in stopwords) return accepted - def get_terms(tree): result = [] ALLOWED_LIST = ['CD','FW','JJ','JJR','JJS','NN','NNS','NNP','NNPS','VB','VBD','VBG','VBN','VBP','VBZ'] @@ -1678,7 +1672,6 @@ def remove_punctuation(s): s = unicode(s) translate_table = dict((ord(c),None) for c in string.punctuation) return s.translate(translate_table) - def mapper(input_value): input_value = remove_punctuation(input_value) input_value_l = pre_process_for_map_reduce(input_value) #This performs pre_processing for map reduce @@ -1690,10 +1683,8 @@ def mapper(input_value): return l - def reducer(intermediate_key,intermediate_value_list): return(intermediate_key,sum(intermediate_value_list)) - def map_reduce(x,mapper,reducer): groups = {} for key,group in itertools.groupby(sorted(mapper(x)),lambda x:x[0]): @@ -1723,7 +1714,7 @@ def perform_map_reduce(request,group_id): particular_instance.delete() return HttpResponse("Map Reduce was performed successfully") """ - +@cache_control(must_revalidate=True, max_age=6) def perform_map_reduce(request,group_id): #connection.register([MyDocs]) #connection.register([ReducedDocs]) @@ -1768,7 +1759,6 @@ def perform_map_reduce(request,group_id): #import sparsesvd from math import sqrt - def td_doc(): """ #{'word':{'ObjectId':number_of_occurances,'ObjectId':number_of_occurances}} @@ -1816,7 +1806,6 @@ def td_doc(): for pmrd in mrdl: pmrd.is_indexed = True pmrd.save() - def generate_big_dict(): #This function will generate a big dictionary i.e. it will simply go and combine all the dictionaries together #connection.register([IndexedWordList]) @@ -1867,7 +1856,6 @@ def sim_distance(prefs,d1,d2): ##print "SUM OF SQUARES :):)",sum_of_squares,(1.0/(1+sum_of_squares)) return (1.0/(1+sum_of_squares)) - def sim_pearson(prefs,d1,d2): #Theoretically --- The results of pearson similarity should be better, but practically the results are much worse #Get the list of mutually rated items @@ -1900,14 +1888,12 @@ def sim_pearson(prefs,d1,d2): r = num/den return r - def topMatches(prefs,document,n=5,similarity=sim_distance): #This function returns the words which are closest to the word which are given to this function scores = [(similarity(prefs,document,other),other) for other in prefs if other != document] scores.sort() scores.reverse() return scores[0:n] - def recommend(prefs,term,similarity = sim_distance): #This function returns the documents which will be closer to the given document each_item_total = {} @@ -1964,7 +1950,7 @@ def recommend(prefs,term,similarity = sim_distance): # return render(request,'ndf/semantic_search.html',{"groupid":group_id}) - +@cache_control(must_revalidate=True, max_age=6) def get_nearby_words(request,group_id): td_doc() prefs = generate_big_dict() @@ -2005,7 +1991,6 @@ def get_nearby_words(request,group_id): context_to_return['search_type'] = SEMANTIC_SEARCH return render(request, 'ndf/search_page.html', context_to_return) - def sort_n_avg(l): """ Helper Function for: get_nearby_words() diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/site.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/site.py index aeb5160ab5..4e80c44974 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/site.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/site.py @@ -9,6 +9,8 @@ from django.views.generic import RedirectView from gnowsys_ndf.ndf.views.methods import get_execution_time from gnowsys_ndf.ndf.views.analytics import * +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control try: from bson import ObjectId @@ -16,6 +18,7 @@ from pymongo.objectid import ObjectId @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def site_about(request): # page_obj = Node.get_node_by_id(page_id) return render_to_response( @@ -26,6 +29,7 @@ def site_about(request): context_instance=RequestContext(request) ) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def site_credits(request): # page_obj = Node.get_node_by_id(page_id) return render_to_response( @@ -37,6 +41,7 @@ def site_credits(request): ) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def site_contact(request): # page_obj = Node.get_node_by_id(page_id) return render_to_response( @@ -48,6 +53,7 @@ def site_contact(request): ) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def site_termsofuse(request): # page_obj = Node.get_node_by_id(page_id) return render_to_response( @@ -58,6 +64,7 @@ def site_termsofuse(request): context_instance=RequestContext(request) ) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def site_privacypolicy(request): # page_obj = Node.get_node_by_id(page_id) return render_to_response( @@ -66,4 +73,4 @@ def site_privacypolicy(request): 'title': 'Privacy Policy', }, context_instance=RequestContext(request) - ) \ No newline at end of file + ) diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/task.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/task.py index 15c2eae22f..d556999d61 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/task.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/task.py @@ -11,6 +11,8 @@ from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User from django.contrib.sites.models import Site +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control # from django.utils import simplejson # from online_status.utils import encode_json @@ -40,6 +42,7 @@ sitename = "" @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def task(request, group_name, task_id=None): """Renders a list of all 'task' available within the database. @@ -68,6 +71,7 @@ def task(request, group_name, task_id=None): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def task_details(request, group_name, task_id): """Renders given task's details. @@ -172,7 +176,9 @@ def task_details(request, group_name, task_id): variables = RequestContext(request, var) template = "ndf/task_details.html" return render_to_response(template, variables) + @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def save_image(request, group_name, app_id=None, app_name=None, app_set_id=None, slug=None): if request.method == "POST" : #here group_name contains the object id of the group insted of name sent from @@ -213,6 +219,7 @@ def save_image(request, group_name, app_id=None, app_name=None, app_set_id=None, @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def create_edit_task(request, group_name, task_id=None, task=None, count=0): """Creates/Modifies details about the given Task. @@ -360,7 +367,6 @@ def create_edit_task(request, group_name, task_id=None, task=None, count=0): context_instance=RequestContext(request) ) - def update(request,rt_list,at_list,task_node,group_id,group_name): file_id=(request.POST.get("files")) file_name=(request.POST.get("files_name")) @@ -527,7 +533,6 @@ def update(request,rt_list,at_list,task_node,group_id,group_name): # End Patch - def create_task(request,task_id,group_id): if task_id: task_node = node_collection.one({'_type': u'GSystem', '_id': ObjectId(task_id)}) @@ -581,7 +586,6 @@ def create_task(request,task_id,group_id): return task_node - def create_task_at_rt(request,rt_list,at_list,task_node,assign,group_name,group_id): file_id=(request.POST.get("files")) file_name=(request.POST.get("files_name")) @@ -667,6 +671,7 @@ def create_task_at_rt(request,rt_list,at_list,task_node,assign,group_name,group_ @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def task_collection(request,group_name,task_id=None,each_page=1): ins_objectid = ObjectId() choice=0 @@ -714,6 +719,7 @@ def task_collection(request,group_name,task_id=None,each_page=1): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def delete_task(request, group_name, _id): """This method will delete task object and its Attribute and Relation """ @@ -766,6 +772,7 @@ def delete_task(request, group_name, _id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def check_filter(request,group_name,choice=1,status='New',each_page=1): at_list = ["Status", "start_time", "Priority", "end_time", "Assignee", "Estimated_time"] blank_dict = {} diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/tasks.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/tasks.py index 2b44bf73e9..877c9f09c8 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/tasks.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/tasks.py @@ -13,6 +13,8 @@ from django.contrib.auth.models import User from django.template.loader import render_to_string from django.contrib.sites.models import Site +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control from gnowsys_ndf.notification import models as notification from gnowsys_ndf.ndf.models import Node diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/term.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/term.py index 3f7fa5c6f1..90be2c8bae 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/term.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/term.py @@ -9,6 +9,8 @@ from django.core.urlresolvers import reverse from django.shortcuts import render_to_response # , render from django.template import RequestContext +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control # from mongokit import paginator @@ -32,6 +34,7 @@ if term_GST: title = term_GST.altnames @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def term(request, group_id, node_id=None): # ins_objectid = ObjectId() @@ -83,6 +86,7 @@ def term(request, group_id, node_id=None): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def create_edit_term(request, group_id, node_id=None): # ins_objectid = ObjectId() @@ -149,6 +153,7 @@ def create_edit_term(request, group_id, node_id=None): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def delete_term(request, group_id, node_id): """Change the status to Hidden. diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/tools.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/tools.py index d7eec4261f..ab02449e30 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/tools.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/tools.py @@ -7,6 +7,9 @@ ''' -- imports from installed packages -- ''' from django.shortcuts import render_to_response # , render from django.template import RequestContext +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control + from django.http import Http404 from collections import OrderedDict try: @@ -17,7 +20,7 @@ from gnowsys_ndf.ndf.views.methods import get_execution_time ''' -- imports from application folders/files -- ''' from gnowsys_ndf.ndf.models import node_collection, triple_collection, gridfs_collection, NodeJSONEncoder,Author, Buddy - +@cache_control(must_revalidate=True, max_age=6) def tools_logging(request): #Method for tools logging @@ -90,6 +93,7 @@ def tools_logging(request): else: return StreamingHttpResponse("Failure") @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def tools_temp(request): context_variables = {'title' : "tools"} return render_to_response( diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/topics.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/topics.py index 81cad4aff6..5cd7495963 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/topics.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/topics.py @@ -9,7 +9,8 @@ from django.core.urlresolvers import reverse from django.shortcuts import render_to_response, render from django.template import RequestContext - +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control from mongokit import paginator try: @@ -33,6 +34,7 @@ ####################################################################################################################################### @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def themes(request, group_id, app_id=None, app_set_id=None): try: @@ -137,7 +139,7 @@ def themes(request, group_id, app_id=None, app_set_id=None): context_instance = RequestContext(request) ) - +@cache_control(must_revalidate=True, max_age=6) def list_themes(request, group_id): try: @@ -162,7 +164,7 @@ def list_themes(request, group_id): }, context_instance = RequestContext(request) ) - +@cache_control(must_revalidate=True, max_age=6) def delete_theme(request, group_id, theme_id): try: @@ -185,6 +187,7 @@ def delete_theme(request, group_id, theme_id): coll_set_dict={} @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def theme_topic_create_edit(request, group_id, app_set_id=None): ##################### @@ -749,6 +752,7 @@ def get_coll_set(node): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def topic_detail_view(request, group_id, app_Id=None): try: @@ -830,7 +834,7 @@ def topic_detail_view(request, group_id, app_Id=None): context_instance = RequestContext(request) ) - +@cache_control(must_revalidate=True, max_age=6) def get_filtered_topic_resources(request, group_id, node_id): selfilters = request.POST.get('filters', None) diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/translation.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/translation.py index 0e11004702..9ca0d9720c 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/translation.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/translation.py @@ -9,6 +9,8 @@ from django.template import RequestContext from django.contrib.auth.decorators import login_required from django.core.urlresolvers import reverse +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control from gnowsys_ndf.ndf.models import Node, GSystem, GSystemType, RelationType, Group from gnowsys_ndf.ndf.models import node_collection, triple_collection @@ -21,7 +23,7 @@ rt_translation_of = Node.get_name_id_from_type('translation_of', 'RelationType', get_obj=True) supported_languages = ['Hindi', 'Telugu'] trans_node_gst_name, trans_node_gst_id = GSystemType.get_gst_name_id("trans_node") - +@cache_control(must_revalidate=True, max_age=6) def all_translations(request, group_id, node_id): ''' returns all translated nodes of provided node. @@ -45,7 +47,7 @@ def all_translations(request, group_id, node_id): 'supported_languages': supported_languages }, context_instance=RequestContext(request)) - +@cache_control(must_revalidate=True, max_age=6) def show_translation(request, group_id, node_id, lang): ''' for VIEW/READ: show translated provided node to provided LANG CODE @@ -91,6 +93,7 @@ def show_translation(request, group_id, node_id, lang): @login_required +@cache_control(must_revalidate=True, max_age=6) def translate(request, group_id, node_id, lang, translated_node_id=None, **kwargs): ''' for EDIT: translate provided node to provided LANG CODE @@ -176,14 +179,12 @@ def translate(request, group_id, node_id, lang, translated_node_id=None, **kwarg return HttpResponseRedirect(reverse('show_translation', kwargs={'group_id': group_id, 'node_id': node_id, 'lang': lang })) # return translated_node, translate_grel - def get_lang_node(node_id,lang): rel_value = get_relation_value(ObjectId(node_id),"translation_of") for each in rel_value['grel_node']: if each.language[0] == get_language_tuple(lang)[0]: trans_node = each return trans_node - def get_trans_node_list(node_list,lang): trans_node_list = [] for each in node_list: @@ -197,7 +198,6 @@ def get_trans_node_list(node_list,lang): # trans_node_list.append({ObjectId(node._id): {"name": node.name, "basenodeid":ObjectId(node._id)}}) if trans_node_list: return trans_node_list - def get_course_content_hierarchy(unit_group_obj,lang="en"): ''' ARGS: unit_group_obj @@ -265,7 +265,6 @@ def get_course_content_hierarchy(unit_group_obj,lang="en"): return unit_structure - def get_unit_hierarchy(unit_group_obj,lang="en"): ''' ARGS: unit_group_obj diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/trash.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/trash.py index f6191a0466..50ac0bfd92 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/trash.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/trash.py @@ -9,10 +9,13 @@ from gnowsys_ndf.ndf.views.methods import * from django.core.urlresolvers import reverse from gnowsys_ndf.settings import GSTUDIO_SITE_NAME +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control trash_group = node_collection.one({'_type': 'Group', "name": u"Trash"}); @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def trash_resource(request,group_id,node_id): ''' Delete Action. @@ -75,6 +78,7 @@ def trash_resource(request,group_id,node_id): # return(eval('group_dashboard')(request, group_id)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) # @staff_required def delete_group(request, group_id, url_name='groupchange'): response_dict = {'success': False} @@ -99,6 +103,7 @@ def delete_group(request, group_id, url_name='groupchange'): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def delete_resource(request,group_id): # NOTE: purge of themes need to be handled differently. # all the collection hierarchy needs to be purged in this case. @@ -114,6 +119,7 @@ def delete_resource(request,group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def restore_resource(request, group_id): group_name, group_id = get_group_name_id(group_id) response_dict = {'success': False} @@ -134,6 +140,7 @@ def restore_resource(request, group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def delete_multiple_resources(request,group_id): files_list = request.POST.getlist("collection[]", '') auth = node_collection.one({'_type': 'Author', 'name': unicode(request.user.username) }) diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/type_created.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/type_created.py index 35316dd702..b2399ca23e 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/type_created.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/type_created.py @@ -5,7 +5,8 @@ from django.core.urlresolvers import reverse from django.shortcuts import render_to_response, render from django.template import RequestContext - +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control try: from bson import ObjectId except ImportError: # old pymongo @@ -18,6 +19,7 @@ from gnowsys_ndf.ndf.views.methods import * @login_required +@cache_control(must_revalidate=True, max_age=6) def type_created(request,group_id): try: group_id = ObjectId(group_id) @@ -36,6 +38,7 @@ def type_created(request,group_id): return render_to_response(template,variable) @login_required +@cache_control(must_revalidate=True, max_age=6) def default_template(request,group_id,node=None,edit_node=None): try: @@ -397,4 +400,4 @@ def default_template(request,group_id,node=None,edit_node=None): 'ats':ats , 'rts':rts , 'node_gs':node_gs , 'gs_struc':gs_struc ,'final_ats':final_ats , 'f_rts_object_dict':f_rts_object_dict , 'f_pos_rts_object_dict':f_pos_rts_object_dict }) - return render_to_response(template,variable) \ No newline at end of file + return render_to_response(template,variable) diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/unit.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/unit.py index dc54fa37a3..177abfe6d2 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/unit.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/unit.py @@ -12,6 +12,8 @@ from django.template import RequestContext from django.contrib.auth.decorators import login_required from django.core.urlresolvers import reverse +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control ''' -- imports from application folders/files -- ''' from gnowsys_ndf.ndf.models import GSystemType, Group, Node, GSystem #, Triple @@ -30,6 +32,7 @@ @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def unit_create_edit(request, group_id, unit_group_id=None): ''' creation as well as eit of units @@ -164,6 +167,7 @@ def unit_create_edit(request, group_id, unit_group_id=None): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def unit_detail(request, group_id): ''' detail of of selected units @@ -191,6 +195,7 @@ def unit_detail(request, group_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def list_units(request, group_id): ''' listing of units @@ -223,6 +228,7 @@ def list_units(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def lesson_create_edit(request, group_id, unit_group_id=None): ''' creation as well as edit of lessons @@ -371,6 +377,7 @@ def lesson_create_edit(request, group_id, unit_group_id=None): # @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def activity_create_edit(request, group_id, lesson_id=None): ''' creation as well as edit of activities @@ -428,7 +435,6 @@ def activity_create_edit(request, group_id, lesson_id=None): return HttpResponse(json.dumps(result_dict)) - def _get_unit_hierarchy(unit_group_obj,lang="en"): ''' ARGS: unit_group_obj diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/userDashboard.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/userDashboard.py index b1397ce315..c3a41fe741 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/userDashboard.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/userDashboard.py @@ -8,7 +8,8 @@ from django.shortcuts import render_to_response # , render from django.template import RequestContext from django.http import Http404 - +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control import ast try: from bson import ObjectId @@ -58,6 +59,7 @@ # V I E W S D E F I N E D F O R U S E R D A S H B O A R D ####################################################################################################################################### @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def userpref(request, group_id): usrid = int(group_id) auth = node_collection.one({'_type': "Author", 'created_by': usrid}) @@ -75,6 +77,7 @@ def userpref(request, group_id): return HttpResponse("Success") @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def uDashboard(request, group_id): try: @@ -302,6 +305,7 @@ def uDashboard(request, group_id): ) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def user_preferences(request, group_id, auth_id): try: grp = node_collection.one({'_id': ObjectId(auth_id)}) @@ -347,6 +351,7 @@ def user_preferences(request, group_id, auth_id): return HttpResponse("Failure") @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def user_template_view(request, group_id): auth_group = None group_list=[] @@ -395,6 +400,7 @@ def user_template_view(request, group_id): @login_required @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def user_activity(request, group_id): activity_user = node_collection.find({'$and':[{'$or':[{'_type':'GSystem'},{'_type':'group'},{'_type':'File'}]}, @@ -421,6 +427,7 @@ def user_activity(request, group_id): return render_to_response(template, variable) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def group_dashboard(request, group_id): """ This view returns data required for group's dashboard. @@ -552,6 +559,7 @@ def group_dashboard(request, group_id): @get_execution_time @login_required +@cache_control(must_revalidate=True, max_age=6) def user_profile(request, group_id): from django.contrib.auth.models import User @@ -612,6 +620,7 @@ def user_profile(request, group_id): @get_execution_time @login_required +@cache_control(must_revalidate=True, max_age=6) def user_data_profile(request, group_id): user = {} auth_node = node_collection.one({"_id":ObjectId(group_id)}) @@ -622,6 +631,7 @@ def user_data_profile(request, group_id): return HttpResponse(json.dumps(user,cls=NodeJSONEncoder)) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def upload_prof_pic(request, group_id): if request.method == "POST" : user = request.POST.get('user','') @@ -683,6 +693,7 @@ def upload_prof_pic(request, group_id): @get_execution_time @login_required +@cache_control(must_revalidate=True, max_age=6) def my_courses(request, group_id): if str(request.user) == 'AnonymousUser': @@ -712,6 +723,7 @@ def my_courses(request, group_id): @get_execution_time @login_required +@cache_control(must_revalidate=True, max_age=6) def my_desk(request, group_id): from gnowsys_ndf.settings import GSTUDIO_WORKSPACE_INSTANCE @@ -794,6 +806,7 @@ def my_desk(request, group_id): @get_execution_time @login_required +@cache_control(must_revalidate=True, max_age=6) def my_groups(request, group_id,page_no=1): from gnowsys_ndf.settings import GSTUDIO_NO_OF_OBJS_PP @@ -837,6 +850,7 @@ def my_groups(request, group_id,page_no=1): @get_execution_time @login_required +@cache_control(must_revalidate=True, max_age=6) def my_dashboard(request, group_id): user_id = eval(group_id) @@ -879,6 +893,7 @@ def my_dashboard(request, group_id): @get_execution_time @login_required +@cache_control(must_revalidate=True, max_age=6) def my_performance(request, group_id): from gnowsys_ndf.settings import GSTUDIO_WORKSPACE_INSTANCE @@ -919,6 +934,7 @@ def my_performance(request, group_id): @get_execution_time @login_required +@cache_control(must_revalidate=True, max_age=6) def save_profile(request, user_id): from django.contrib.auth.models import User diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/utils.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/utils.py index e6b0d1fda5..6e47ac6646 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/utils.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/utils.py @@ -4,13 +4,14 @@ ''' import bson import datetime +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control try: from bson import ObjectId except ImportError: # old pymongo from pymongo.objectid import ObjectId - def get_dict_from_list_of_dicts(list_of_dicts,convert_objid_to_str=False): req_dict = {} [req_dict.update(d) for d in list_of_dicts] @@ -19,7 +20,6 @@ def get_dict_from_list_of_dicts(list_of_dicts,convert_objid_to_str=False): return str_val_dict return req_dict - def get_query_dict(**kwargs): ''' Example: @@ -55,7 +55,6 @@ def add_to_list(list_to_update, value_to_append): list_to_update.append(value_to_append) return list_to_update - def cast_to_data_type(value, data_type): ''' This method will cast first argument: "value" to second argument: "data_type" and returns casted value. @@ -115,7 +114,6 @@ def cast_to_data_type(value, data_type): return casted_value - def replace_in_list(list_to_update, old_val, new_val, append_if_not=False): ''' Replace with in list_to_update, if exists. @@ -152,7 +150,6 @@ def merge_lists_and_maintain_unique_ele(list_a, list_b, advanced_merge=False): merged_list = list(set(list_a) | set(list_b)) return merged_list - def reverse_dict_having_listvalues(dict_listvalues): ''' >>> reverse_dict_having_listvalues({ 'a': ['b', 'c'], 'd': ['e', 'f'] }) diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/version.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/version.py index 6cf43f9dfe..efb8cac034 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/version.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/version.py @@ -7,6 +7,9 @@ from gnowsys_ndf.ndf.views.methods import get_versioned_page, get_page, get_resource_type, diff_string,get_published_version_list from gnowsys_ndf.ndf.views.methods import get_group_name_id from gnowsys_ndf.ndf.views.methods import parse_data +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control + try: from bson import ObjectId except ImportError: # old pymongo @@ -16,7 +19,7 @@ from gnowsys_ndf.ndf.models import HistoryManager history_manager = HistoryManager() - +@cache_control(must_revalidate=True, max_age=6) def version_node(request, group_id, node_id, version_no = None): """Renders either a single or compared version-view based on request. @@ -122,7 +125,6 @@ def version_node(request, group_id, node_id, version_no = None): context_instance = RequestContext(request) ) - def diff_prettyHtml(diffs): """Convert a diff array into a pretty HTML report. @@ -201,7 +203,7 @@ def get_html_diff(versionfile, fromfile="", tofile=""): print "\n Please pass a valid rcs-version-file!!!\n" #TODO: Throw an error indicating the above message! return "" - +@cache_control(must_revalidate=True, max_age=6) def merge_doc(request,group_id,node_id,version_1,version_2): node = node_collection.one({'_id': ObjectId(node_id)}) doc=history_manager.get_version_document(node,version_1) @@ -244,7 +246,7 @@ def merge_doc(request,group_id,node_id,version_1,version_2): ) - +@cache_control(must_revalidate=True, max_age=6) def revert_doc(request,group_id,node_id,version_1): node = node_collection.one({'_id': ObjectId(node_id)}) group = node_collection.one({'_id': ObjectId(group_id)}) diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/videoDashboard.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/videoDashboard.py index 57262ad129..cf01a788f9 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/videoDashboard.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/videoDashboard.py @@ -4,6 +4,9 @@ from django.core.urlresolvers import reverse from django.shortcuts import render_to_response # , render from django.template import RequestContext +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control + import json try: from bson import ObjectId @@ -23,6 +26,7 @@ file_gst = node_collection.find_one( { "_type" : "GSystemType","name":"File" } ) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def videoDashboard(request, group_id): # ins_objectid = ObjectId() # if ins_objectid.is_valid(group_id) is False : @@ -77,6 +81,7 @@ def videoDashboard(request, group_id): variable = RequestContext(request, {'group_id':group_id,'groupid':group_id,'files_cur':files_cur}) return render_to_response(template, variable) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def getvideoThumbnail(request, group_id, _id): # ins_objectid = ObjectId() # if ins_objectid.is_valid(group_id) is False : @@ -104,7 +109,8 @@ def getvideoThumbnail(request, group_id, _id): else: f = videoobj.fs.files.get(ObjectId(videoobj.fs_file_ids[0])) return HttpResponse(f.read(), content_type=f.content_type) -@get_execution_time +@get_execution_time +@cache_control(must_revalidate=True, max_age=6) def getFullvideo(request, group_id, _id): # ins_objectid = ObjectId() # if ins_objectid.is_valid(group_id) is False : @@ -134,7 +140,8 @@ def getFullvideo(request, group_id, _id): f = videoobj.fs.files.get(ObjectId(videoobj.fs_file_ids[0])) return HttpResponse(f.read(), content_type=f.content_type) -@get_execution_time +@get_execution_time +@cache_control(must_revalidate=True, max_age=6) def video_search(request,group_id): # ins_objectid = ObjectId() # if ins_objectid.is_valid(group_id) is False : @@ -162,6 +169,7 @@ def video_search(request,group_id): return render_to_response(template,variable) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def video_detail(request, group_id, _id): # ins_objectid = ObjectId() # if ins_objectid.is_valid(group_id) is False : @@ -207,7 +215,8 @@ def video_detail(request, group_id, _id): }, context_instance = RequestContext(request) ) -@get_execution_time +@get_execution_time +@cache_control(must_revalidate=True, max_age=6) def video_edit(request,group_id,_id): # ins_objectid = ObjectId() # if ins_objectid.is_valid(group_id) is False : diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/visualize.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/visualize.py index 4416ef0117..c6bc5649ca 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/visualize.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/visualize.py @@ -13,6 +13,8 @@ from django.template.defaultfilters import slugify from django.core.urlresolvers import reverse from django.contrib.auth.decorators import login_required +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control try: from bson import ObjectId @@ -36,6 +38,7 @@ db = get_database() collection = db[Node.collection_name] @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def graphs(request,group_id): # HttpResponseRedirect("ndf/visualize.html", # { diff --git a/gnowsys-ndf/gnowsys_ndf/ndf/views/wikidata.py b/gnowsys-ndf/gnowsys_ndf/ndf/views/wikidata.py index 8a84d6c422..9471e9ccfd 100644 --- a/gnowsys-ndf/gnowsys_ndf/ndf/views/wikidata.py +++ b/gnowsys-ndf/gnowsys_ndf/ndf/views/wikidata.py @@ -4,8 +4,11 @@ from gnowsys_ndf.ndf.models import node_collection, triple_collection from gnowsys_ndf.ndf.models import * from gnowsys_ndf.ndf.views.methods import get_execution_time +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_control @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def index(request, group_id): # ins_objectid = ObjectId() # if ins_objectid.is_valid(group_id) is False : @@ -47,6 +50,7 @@ def index(request, group_id): return render(request, template, {'title': "WikiData Topics", 'topic_coll': topic_coll, 'tag_count': tag_count, 'tag_coll': tag_coll, 'selected_topic': selected_topic, 'attribute_set' : attribute_set, 'groupid':group_id, 'group_id':group_id,'topic_count':topic_count}) @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def details(request, group_id, topic_id): # ins_objectid = ObjectId() # group_ins = None @@ -94,6 +98,7 @@ def details(request, group_id, topic_id): @get_execution_time +@cache_control(must_revalidate=True, max_age=6) def tag_view_list(request, group_id, topic_id, tag): # ins_objectid = ObjectId() # group_ins = None diff --git a/gnowsys-ndf/gnowsys_ndf/settings.py b/gnowsys-ndf/gnowsys_ndf/settings.py index d693966910..39af4e76e7 100755 --- a/gnowsys-ndf/gnowsys_ndf/settings.py +++ b/gnowsys-ndf/gnowsys_ndf/settings.py @@ -428,7 +428,23 @@ # 'django.template.loaders.eggs.Loader', ) +CACHES = { + 'default': { + 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', + 'LOCATION': '', #configure the path where you want to cache on filesystem + 'TIMEOUT': 2, #tolerance level for cache-staling + 'OPTIONS': { + 'MAX_ENTRIES':100000 + } + } +} + +CACHE_MIDDLEWARE_ALIAS='default' +CACHE_MIDDLEWARE_SECONDS= 2 +CACHE_MIDDLEWARE_KEY_PREFIX= '' + MIDDLEWARE_CLASSES = ( + 'django.middleware.cache.UpdateCacheMiddleware', #added for caching 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', @@ -440,17 +456,15 @@ 'pagination.middleware.PaginationMiddleware', # 'django.middleware.cache.UpdateCacheMiddleware', # 'django.middleware.cache.FetchFromCacheMiddleware', - # Uncomment the next line for simple clickjacking protection: # 'django.middleware.clickjacking.XFrameOptionsMiddleware', - # gstudio custom middleware(s): 'gnowsys_ndf.ndf.middleware.SetData.UserDetails', 'gnowsys_ndf.ndf.middleware.SetData.Author', 'gnowsys_ndf.ndf.middleware.SetData.AdditionalDetails', # 'gnowsys_ndf.ndf.middleware.Buddy.BuddySession', 'gnowsys_ndf.ndf.middleware.UserRestrictMiddleware.UserRestrictionMiddleware', - + 'django.middleware.cache.FetchFromCacheMiddleware', #added for caching # for profiling methods: # 'gnowsys_ndf.ndf.middleware.ProfileMiddleware.ProfileMiddleware', ) diff --git a/requirements.txt b/requirements.txt index 4fab44935f..535f183aec 100644 --- a/requirements.txt +++ b/requirements.txt @@ -65,5 +65,10 @@ checksumdir==1.1.0 cryptography==1.4 diskcache==3.0.1 +# dependencies for full-site caching script +firefox==61.0 +selenium==3.13.0 +geckodriver==0.20.1 + # version needed to overwrite on all above intermediate installs pymongo==2.8