Properties are now cached globally instead of being stored in the session
authordurandn
Mon, 13 Apr 2015 12:03:48 +0200
changeset 95 0a131f9b92a5
parent 94 71a4a7300c35
child 96 9f17fdf3b0fc
Properties are now cached globally instead of being stored in the session
src/catedit/resources.py
src/catedit/templates/categories/editor.html
src/catedit/templates/macros.html
src/catedit/utils.py
src/catedit/views/categories.py
--- a/src/catedit/resources.py	Fri Apr 10 17:46:38 2015 +0200
+++ b/src/catedit/resources.py	Mon Apr 13 12:03:48 2015 +0200
@@ -10,6 +10,7 @@
 from catedit.models import Category, CategoryManager
 import catedit.persistence
 from catedit.tasks import submit_changes
+from catedit.utils import get_property_list
 from io import StringIO
 
 from flask import session
@@ -137,17 +138,16 @@
             
             new_property_list=[]
             for (predicate, obj) in cat_data["properties"]:
-                if session["properties"][repository].get(predicate, {}).get("object_type") == "uriref-category":
+                if get_property_list()[repository].get(predicate, {}).get("object_type") == "uriref-category":
                     new_property_list.append(
-                        (URIRef(session["properties"][repository][predicate]["rdflib_class"]), app.config["CATEGORY_NAMESPACE"][obj])
+                        (URIRef(get_property_list()[repository][predicate]["rdflib_class"]), app.config["CATEGORY_NAMESPACE"][obj])
                     )
-                elif session["properties"][repository][predicate]["object_type"] == "uriref-link":
                     new_property_list.append(
-                        (URIRef(session["properties"][repository][predicate]["rdflib_class"]), URIRef(obj))
+                        (URIRef(get_property_list()[repository][predicate]["rdflib_class"]), URIRef(obj))
                     )
                 else:
                     new_property_list.append(
-                        (URIRef(session["properties"][repository][predicate]["rdflib_class"]), Literal(obj))
+                        (URIRef(get_property_list()[repository][predicate]["rdflib_class"]), Literal(obj))
                     )
             
             cat.edit_category(new_description=cat_data["description"],
@@ -184,17 +184,17 @@
         """
         property_list = []
         for (predicate, obj) in cat_data["properties"]:
-            if session["properties"][repository].get(predicate, {}).get("object_type", "") == "uriref-category": # faire des get
+            if get_property_list()[repository].get(predicate, {}).get("object_type", "") == "uriref-category": # faire des get
                 property_list.append(
-                    (URIRef(session["properties"][repository][predicate]["rdflib_class"]), app.config["CATEGORY_NAMESPACE"][obj])
+                    (URIRef(get_property_list()[repository][predicate]["rdflib_class"]), app.config["CATEGORY_NAMESPACE"][obj])
                 )
-            elif session["properties"][repository].get(predicate, {}).get("object_type", "") == "uriref-link":
+            elif get_property_list()[repository].get(predicate, {}).get("object_type", "") == "uriref-link":
                 property_list.append(
-                    (URIRef(session["properties"][repository][predicate]["rdflib_class"]), URIRef(obj))
+                    (URIRef(get_property_list()[repository][predicate]["rdflib_class"]), URIRef(obj))
                 )
             else:
                 property_list.append(
-                    (URIRef(session["properties"][repository][predicate]["rdflib_class"]), Literal(obj))
+                    (URIRef(get_property_list()[repository][predicate]["rdflib_class"]), Literal(obj))
                 )
         
         cat = Category(
@@ -281,10 +281,9 @@
                         new_property_list = []
                         for (predicate, obj) in modified_cat.properties:
                             if not (
-                                    session["properties"]
-                                           [repository]
-                                           [predicate.toPython()]
-                                           ["object_type"]
+                                    get_property_list()[repository]
+                                                       [predicate.toPython()]
+                                                       ["object_type"]
                                     == "uriref-category"
                                     and (obj == app.config["CATEGORY_NAMESPACE"][deleted_cat_id])
                             ):
@@ -313,10 +312,9 @@
                         new_property_list = []
                         for (predicate, obj) in cat.properties:
                             if not (
-                                    session["properties"]
-                                           [repository]
-                                           [predicate.toPython()]
-                                           ["object_type"]
+                                    get_property_list()[repository]
+                                                       [predicate.toPython()]
+                                                       ["object_type"]
                                     == "uriref-category"
                                     and (obj == app.config["CATEGORY_NAMESPACE"][deleted_cat_id])
                             ):
--- a/src/catedit/templates/categories/editor.html	Fri Apr 10 17:46:38 2015 +0200
+++ b/src/catedit/templates/categories/editor.html	Mon Apr 13 12:03:48 2015 +0200
@@ -63,9 +63,9 @@
         <option id="property_type_default" label="Liste des propriétés ..." selected="selected">
           Liste des propriétés ...
         </option>
-        {% for predicate in session["properties"][current_repository] %}
-          {% if session["properties"][current_repository][predicate]["usable_in_editor"] %}
-            <option value='{{ predicate }}' label="{{ session['properties'][current_repository][predicate]['descriptive_label_fr'] }}" class="{{ session['properties'][current_repository][predicate]['object_type'] }}">{{ session["properties"][current_repository][predicate]["descriptive_label_fr"] }}</option>
+        {% for predicate in get_property_list()[current_repository] %}
+          {% if get_property_list()[current_repository][predicate]["usable_in_editor"] %}
+            <option value='{{ predicate }}' label="{{ get_property_list()[current_repository][predicate]['descriptive_label_fr'] }}" class="{{ get_property_list()[current_repository][predicate]['object_type'] }}">{{ session["properties"][current_repository][predicate]["descriptive_label_fr"] }}</option>
           {% endif %}
         {% endfor %}
       </select>
@@ -91,14 +91,14 @@
             {% for property in form.properties %}
                 <tr id="properties-{{property_count}}">
                   <input id="properties-{{property_count}}-csrf_token" name="properties-{{property_count}}-csrf_token" value="{{ csrf_token() }}" type="hidden">
-                  {% if session["properties"][current_repository][property.property_predicate.data]["object_type"]=="uriref-category" %}
+                  {% if get_property_list()[current_repository][property.property_predicate.data]["object_type"]=="uriref-category" %}
                     {% for cat in cat_list %}
                       {% if property.property_object.data == cat.cat_id %}
                         {% if cat.cat_id not in deleted_cat_list %}
                           {{ property.property_predicate() }}
                           {{ property.property_object() }}
                           <td id="predicate_td{{ property_count }}">
-                            <strong>{{ session["properties"][current_repository][property.property_predicate.data]["descriptive_label_fr"] }}</strong>
+                            <strong>{{ get_property_list()[current_repository][property.property_predicate.data]["descriptive_label_fr"] }}</strong>
                           </td>
                           <td id="object_td{{property_count-1}}">
                             {{ cat.cat_label }}
@@ -113,10 +113,10 @@
                       {{ property.property_predicate() }}
                       {{ property.property_object() }}
                     <td id="predicate_td{{ property_count }}">
-                      <strong>{{ session["properties"][current_repository][property.property_predicate.data]["descriptive_label_fr"] }}</strong>
+                      <strong>{{ get_property_list()[current_repository][property.property_predicate.data]["descriptive_label_fr"] }}</strong>
                     </td>
                     <td id="object_td{{ property_count }}">
-                      {% if session["properties"][current_repository][property.property_predicate.data]["object_type"]=="uriref-link" %}
+                      {% if get_property_list()[current_repository][property.property_predicate.data]["object_type"]=="uriref-link" %}
                         <a href="{{ property.property_object.data }}">{{ property.property_object.data }}</a>
                       {% else %}
                         {{ property.property_object.data }}
--- a/src/catedit/templates/macros.html	Fri Apr 10 17:46:38 2015 +0200
+++ b/src/catedit/templates/macros.html	Mon Apr 13 12:03:48 2015 +0200
@@ -72,15 +72,15 @@
             {% if cat.cat_properties|length == 0 %} <dt></dt><dd>Aucune autre propriété</dd>
             {% else %}
               {% for (predicate, object) in cat.cat_properties %}
-                <dt>{{ session["properties"][current_repository][predicate.toPython()]["descriptive_label_fr"] }}</dt>
+                <dt>{{ get_property_list()[current_repository][predicate.toPython()]["descriptive_label_fr"] }}</dt>
                 <dd>
-                  {% if session["properties"][current_repository][predicate.toPython()]["object_type"]=="uriref-category" %}
+                  {% if get_property_list()[current_repository][predicate.toPython()]["object_type"]=="uriref-category" %}
                     {% for cat in cat_list %}
                       {% if object == config["CATEGORY_NAMESPACE"][cat.cat_id] %}
                         {{ cat.cat_label }}
                       {% endif %}
                     {% endfor %}
-                  {% elif session["properties"][current_repository][predicate.toPython()]["object_type"]=="uriref-link" %}
+                  {% elif get_property_list()[current_repository][predicate.toPython()]["object_type"]=="uriref-link" %}
                     <a href="{{ object }}">{{ object }}</a>
                   {% else %}
                     {{ object }}
--- a/src/catedit/utils.py	Fri Apr 10 17:46:38 2015 +0200
+++ b/src/catedit/utils.py	Mon Apr 13 12:03:48 2015 +0200
@@ -2,13 +2,17 @@
     utils.py:
     Module that lists utility functions used through the app
 """
-from catedit import app
+from base64 import b64decode
+from catedit import app, cache, github, log_api_rate
+import json
 import logging
 
 from flask import session
 from rdflib import RDF, RDFS, URIRef
 from rdflib.compare import to_isomorphic, graph_diff
 
+from flask.ext.github import GitHubError
+
 
 logger = logging.getLogger(__name__)
 
@@ -56,9 +60,9 @@
         in_first = []
         in_both = []
         in_second = []
-        logger.debug(rdf_in_both)
-        logger.debug(rdf_only_in_first)
-        logger.debug(rdf_only_in_second)
+        #TODO: vérifier encoding - logger.debug(rdf_in_both)
+        #TODO: vérifier encoding - logger.debug(rdf_only_in_first)
+        #TODO: vérifier encoding - logger.debug(rdf_only_in_second)
         for (final_list, diff_list) in [
                 (in_both, rdf_in_both),
                 (in_first, rdf_only_in_first),
@@ -70,17 +74,15 @@
                 elif triple[1] == RDF.Description:
                     final_list.append(("description", triple[2].toPython()))
                 else:
-                    for predicate in session["properties"][repository].keys():
+                    for predicate in get_property_list()[repository].keys():
                         if triple[1] == \
-                        URIRef(session["properties"][repository][predicate]["rdflib_class"]):
-                            if (session["properties"]
-                                       [repository]
-                                       [predicate]
-                                       ["object_type"] == "uriref-link"
-                            or session["properties"]
-                                      [repository]
-                                      [predicate]
-                                      ["object_type"] == "literal"):
+                        URIRef(get_property_list()[repository][predicate]["rdflib_class"]):
+                            if (get_property_list()[repository]
+                                                   [predicate]
+                                                   ["object_type"] == "uriref-link"
+                            or get_property_list()[repository]
+                                                  [predicate]
+                                                  ["object_type"] == "literal"):
                                 final_list.append(
                                     (
                                         predicate,
@@ -141,3 +143,42 @@
         "modifications": modified_categories,
         "deletions": deleted_categories
     }
+
+def get_property_list():
+    """
+        Function to get the property list, also registered in templates
+    """
+    cache_key = "property_lists_dict"
+    if cache.get(cache_key) is None:
+        property_list = {
+            repo: {} for repo
+            in app.config["PERSISTENCE_CONFIG"]["REPOSITORY_LIST"]
+        }
+        if app.config["PERSISTENCE_CONFIG"]["METHOD"] == "PersistenceToGithub":
+            for repo in app.config["PERSISTENCE_CONFIG"]["REPOSITORY_LIST"]:
+                try:
+                    json_file=github.get(
+                        "repos/"
+                        + app.config["PERSISTENCE_CONFIG"]["REPOSITORY_OWNER"] + "/"
+                        + repo + "/contents/properties/properties.json",
+                        hooks=dict(response=log_api_rate)
+                    )
+                    #TODO: vérifier encoding - logger.debug("repo: "+repo+" - properties: "+str(json.loads(str(b64decode(json_file["content"]), "utf-8")))) #wat
+                    property_list[repo] = json.loads(str(b64decode(json_file["content"]), "utf-8"))["property_list"]
+                except GitHubError as ghe:
+                    logger.debug(
+                        "GitHub Error trying to get the property list. We'll assume " +
+                        "there is none and use default list as defined in config.py"
+                    )
+                    property_list[repo] = app.config["PROPERTY_LIST"]
+        else:
+            for repo in app.config["PERSISTENCE_CONFIG"]["REPOSITORY_LIST"]:
+                property_list[repo] = app.config["PROPERTY_LIST"]
+        rv = property_list
+        cache.set(cache_key, rv, timeout=3600)
+        return rv
+    else: 
+        return cache.get(cache_key)
+app.jinja_env.globals['get_property_list'] = get_property_list  
+
+
--- a/src/catedit/views/categories.py	Fri Apr 10 17:46:38 2015 +0200
+++ b/src/catedit/views/categories.py	Mon Apr 13 12:03:48 2015 +0200
@@ -9,6 +9,7 @@
 from catedit.views.utils import check_user_status_and_repo_access, \
                                 get_current_category_list, get_commits, \
                                 get_issues
+from catedit.utils import get_property_list
 from io import StringIO
 
 from flask import render_template, request, redirect, url_for, abort, Blueprint, session
@@ -318,7 +319,7 @@
     cat_changes = cat_changes_api_instance.get(repository)[0]
     deleted_cat_dict = cat_changes["deleted_categories"]
     modified_cat_dict = cat_changes["modified_categories"]
-    logger.debug(changes_response)
+    #TODO: vérifier encoding - logger.debug(changes_response)
 
     for modified_cat_name in modified_cat_dict.keys():
         modified_cat_rdf_graph = Graph()
@@ -354,10 +355,7 @@
             cat_form.label.data = current_cat.label
             cat_form.description.data = current_cat.description
             for (cat_predicate, cat_object) in current_cat_properties:
-                if session["properties"] \
-                          [repository] \
-                          [cat_predicate.toPython()] \
-                          ["object_type"] == "uriref-category":
+                if get_property_list()[repository][cat_predicate.toPython()]["object_type"] == "uriref-category":
                     namespace, object_id = cat_object.split("#", 1)
                 else:
                     object_id = cat_object