started refactoring viewe + fix bug with corrupted properties
authordurandn
Fri, 17 Apr 2015 10:45:30 +0200
changeset 131 7684ea24c330
parent 130 ef95cc947b59
child 132 04de6a298527
started refactoring viewe + fix bug with corrupted properties
src/catedit/config.py.tmpl
src/catedit/resources.py
src/catedit/templates/categories/submit.html
src/catedit/templates/categories/workshop.html
src/catedit/templates/macros.html
src/catedit/views/categories.py
src/catedit/views/forms.py
--- a/src/catedit/config.py.tmpl	Thu Apr 16 21:23:49 2015 +0200
+++ b/src/catedit/config.py.tmpl	Fri Apr 17 10:45:30 2015 +0200
@@ -39,6 +39,7 @@
     """
     CACHE_CONFIG = {
         "CACHE_TYPE": "simple"
+        "CACHE_DEFAULT_TIMEOUT": 3600
     }
 
     """
--- a/src/catedit/resources.py	Thu Apr 16 21:23:49 2015 +0200
+++ b/src/catedit/resources.py	Fri Apr 17 10:45:30 2015 +0200
@@ -149,9 +149,6 @@
                     new_property_list.append(
                         (URIRef(get_property_list()[repository][predicate]["rdflib_class"]), app.config["CATEGORY_NAMESPACE"][obj])
                     )
-                    new_property_list.append(
-                        (URIRef(get_property_list()[repository][predicate]["rdflib_class"]), URIRef(obj))
-                    )
                 else:
                     new_property_list.append(
                         (URIRef(get_property_list()[repository][predicate]["rdflib_class"]), Literal(obj))
--- a/src/catedit/templates/categories/submit.html	Thu Apr 16 21:23:49 2015 +0200
+++ b/src/catedit/templates/categories/submit.html	Fri Apr 17 10:45:30 2015 +0200
@@ -19,12 +19,12 @@
         });
       });
       $(".cat-delete-toggle").click(function(evt){
-        $("#delete_confirm_"+evt.target.id.split('_').slice(2,5).join('_')).slideToggle("fast");
+        $("#delete_confirm_"+evt.redirect_target.id.split('_').slice(2,5).join('_')).slideToggle("fast");
       });
       $(".cat-info-toggle").click(function(evt){
-        $("#properties_"+evt.target.id.split('_').slice(2,5).join('_')).slideToggle(function(){
-          $("#info_button_"+evt.target.id.split('_').slice(2,5).join('_')).children().toggleClass("glyphicon-plus-sign");
-          $("#info_button_"+evt.target.id.split('_').slice(2,5).join('_')).children().toggleClass("glyphicon-minus-sign");
+        $("#properties_"+evt.redirect_target.id.split('_').slice(2,5).join('_')).slideToggle(function(){
+          $("#info_button_"+evt.redirect_target.id.split('_').slice(2,5).join('_')).children().toggleClass("glyphicon-plus-sign");
+          $("#info_button_"+evt.redirect_target.id.split('_').slice(2,5).join('_')).children().toggleClass("glyphicon-minus-sign");
         });
       });
     });
@@ -46,7 +46,7 @@
   <h2><b>CatEdit</b> - <small>{{current_repository}}</small></h2>
   <h3> Soumettre mes changements </h3>
   <div class="col-md-12">
-    <form method="POST" action="{{ url_for('categories.submit', repository=current_repository)}}">
+    <form method="POST" action="{{ url_for('categories.push_changes', repository=current_repository)}}">
       <fieldset {% if readonly %}disabled{% endif %}>
         {{ commit_form.hidden_tag() }}
         <div class="form-group">
@@ -87,7 +87,7 @@
         </tr>
       {% else %}
         {% import "macros.html" as macros %}
-        {{ macros.category_table(cat_list, current_repository, state_list=["created"], target="categories.submit", buttons_id="created") }}
+        {{ macros.category_table(cat_list, current_repository, state_list=["created"], redirect_target="submit", buttons_id="created") }}
       {% endif %}
       <tr class="warning">
         <td class="col-md-12" colspan="5">
@@ -100,7 +100,7 @@
       </tr>
       {% else %}
         {% import "macros.html" as macros %}
-        {{ macros.category_table(cat_list, current_repository, state_list=["modified"], target="categories.submit", buttons_id="modified") }}
+        {{ macros.category_table(cat_list, current_repository, state_list=["modified"], redirect_target="submit", buttons_id="modified") }}
       {% endif %}
 
       <tr class="danger">
@@ -114,7 +114,7 @@
       </tr>
       {% else %}
         {% import "macros.html" as macros %}
-        {{ macros.category_table(cat_list, current_repository, state_list=["deleted"], target="categories.submit", buttons_id="deleted") }}
+        {{ macros.category_table(cat_list, current_repository, state_list=["deleted"], redirect_target="submit", buttons_id="deleted") }}
       {% endif %}
     {% endif %}
     </tbody>
--- a/src/catedit/templates/categories/workshop.html	Thu Apr 16 21:23:49 2015 +0200
+++ b/src/catedit/templates/categories/workshop.html	Fri Apr 17 10:45:30 2015 +0200
@@ -113,7 +113,7 @@
           </tr>
         {% else %}
           {% import "macros.html" as macros %}
-          {{ macros.category_table(cat_list, current_repository, target="categories.workshop") }}
+          {{ macros.category_table(cat_list, current_repository, redirect_target="workshop") }}
         {% endif %}
       {% endif %}
       </tbody>
--- a/src/catedit/templates/macros.html	Thu Apr 16 21:23:49 2015 +0200
+++ b/src/catedit/templates/macros.html	Fri Apr 17 10:45:30 2015 +0200
@@ -1,4 +1,4 @@
-{% macro category_table(cat_list, current_repository, state_list=["mixed"], target="", interactive=True, with_colors=True, buttons_id="") -%}
+{% macro category_table(cat_list, current_repository, state_list=["mixed"], redirect_target="categories.workshop", interactive=True, with_colors=True, buttons_id="") -%}
   {% for cat in cat_list %}
     {% if state_list == ["mixed"] or (cat.state in state_list) %}
       <tr
@@ -46,7 +46,7 @@
           </td>
           {% else %}
           <td colspan="2" class="text-center">
-            <form method="POST" action="{{url_for(target, deleted_cat_id=cat.cat_id, repository=current_repository)}}" class="form-inline">
+            <form method="POST" action="{{url_for('categories.delete_category', deleted_cat_id=cat.cat_id, repository=current_repository, redirect_to=redirect_target)}}" class="form-inline">
               <input name="csrf_token" value="{{ csrf_token() }}" type="hidden">
               <a title="Restaurer catégorie">
                 <button class="btn btn-default" type="submit">Restaurer</button>
@@ -95,9 +95,9 @@
             <div class="cat-delete-div" id="delete_confirm_{% if ((cat.state != 'untouched') and (cat.state != 'original')) %}edited_{% endif %}{{cat.cat_id}}{% if buttons_id %}-{{ buttons_id }}{% endif %}">
               <form method="POST" action=
                 "{% if cat.state == 'modified' or cat.state == 'created' %}
-                  {{url_for(target, deleted_changes_id=cat.cat_id, repository=current_repository)}}
+                  {{url_for('categories.delete_changes', deleted_changes_id=cat.cat_id, repository=current_repository, redirect_to=redirect_target)}}
                  {% else %}
-                  {{url_for(target, deleted_cat_id=cat.cat_id, repository=current_repository)}}
+                  {{url_for('categories.delete_category', deleted_cat_id=cat.cat_id, repository=current_repository, redirect_to=redirect_target)}}
                  {% endif %}" class="form-inline">
                 <label> Vous allez supprimer {% if (cat.state == "modified") or (cat.state == "created") %} les changements sur {% endif %} la catégorie. </label>
                 <input name="csrf_token" value="{{ csrf_token() }}" type="hidden">
--- a/src/catedit/views/categories.py	Thu Apr 16 21:23:49 2015 +0200
+++ b/src/catedit/views/categories.py	Fri Apr 17 10:45:30 2015 +0200
@@ -12,7 +12,7 @@
 from catedit.utils import get_property_list
 from io import StringIO
 
-from flask import render_template, request, redirect, url_for, abort, Blueprint, session
+from flask import render_template, request, redirect, url_for, abort, Blueprint
 from rdflib import Graph
 
 from catedit.views.forms import CommitForm, CategoryForm
@@ -23,91 +23,82 @@
 
 
 @module.route(
-    '/<string:repository>/workshop',
-    defaults={'deleted_cat_id': None, 'deleted_changes_id': None},
-    methods=['GET', 'POST']
+    '/<string:repository>/workshop', methods=['GET']
 )
-@module.route(
-    '/<string:repository>/workshop/delete-modifs-<deleted_changes_id>',
-    defaults={'deleted_cat_id': None},
-    methods=['POST']
-)
-@module.route(
-    '/<string:repository>/workshop/delete-<deleted_cat_id>',
-    defaults={'deleted_changes_id': None},
-    methods=['POST']
-)
-def workshop(repository, deleted_cat_id, deleted_changes_id):
+def workshop(repository):
     """
         View that has a list of all categories available. Template is
         categories/workshop.html, located in src/templates/
+    """
+    if repository not in app.config["PERSISTENCE_CONFIG"]["REPOSITORY_LIST"]:
+        abort(404)
 
-        Note: it also handles category deletion from the same page.
+    check_user_status_and_repo_access(repository)
+    
+    cat_list = get_current_category_list(repository=repository)
+    cat_list = sorted(cat_list, key=lambda cat: cat['cat_id'])
+    changeset_list = get_commits(repository, 5, 1)[0]
+    discussion_list = get_issues(repository, 5, 1)[0]
+    return render_template(
+        'categories/workshop.html',
+        cat_list=cat_list,
+        changeset_list=changeset_list,
+        discussion_list=discussion_list,
+        current_repository=repository
+    )
+
+
+@module.route(
+    '/<string:repository>/delete-modifs-<deleted_changes_id>&redirect_to=<redirect_to>',
+    methods=['POST']
+)
+def delete_changes(repository, deleted_changes_id, redirect_to):
+    """
+        View that handles deleting changes for a given repo. If no deleted_changes_id is
+        given, it will delete every change
     """
     if repository not in app.config["PERSISTENCE_CONFIG"]["REPOSITORY_LIST"]:
         abort(404)
 
     check_user_status_and_repo_access(repository)
-
-    cat_api_instance = CategoryAPI()
+    
     cat_changes_api_instance = CategoryChangesAPI()
-
-    if request.method == "POST":
-        if deleted_changes_id is None and deleted_cat_id is None:
-            cat_changes_api_instance.delete(repository=repository)
-        elif deleted_changes_id is not None:
-            cat_changes_api_instance.delete(
-                repository=repository,
-                modified_cat_id=deleted_changes_id
-            )
-        # We identify if we want to delete a category
-        elif deleted_cat_id is not None:
-            cat_api_instance.delete(
-                repository=repository,
-                deleted_cat_id=deleted_cat_id
-            )
-        return redirect(url_for('categories.workshop', repository=repository))
-    elif request.method == "GET":
+    if deleted_changes_id is None:
+        cat_changes_api_instance.delete(repository=repository)
+    else:
+        cat_changes_api_instance.delete(
+            repository=repository,
+            modified_cat_id=deleted_changes_id
+        )
+    return redirect(url_for('categories.'+redirect_to, repository=repository))
 
-        cat_list = get_current_category_list(repository=repository)
-            # logger.debug(c.properties)
-        cat_list = sorted(cat_list, key=lambda cat: cat['cat_id'])
-        changeset_list = get_commits(
-            repository,
-            5,
-            1
-        )[0]
-        discussion_list = get_issues(
-            repository,
-            5,
-            1
-        )[0]
-        #logger.debug(repr(cat_list))
-        return render_template(
-            'categories/workshop.html',
-            cat_list=cat_list,
-            changeset_list=changeset_list,
-            discussion_list=discussion_list,
-            current_repository=repository
-        )
-        
 
 @module.route(
-    '/<string:repository>/submit/delete-changes-<deleted_changes_id>',
-    defaults={'deleted_cat_id': None},
+    '/<string:repository>/delete-<deleted_cat_id>&redirect_to=<redirect_to>',
     methods=['POST']
 )
-@module.route(
-    '/<string:repository>/submit/delete-<deleted_cat_id>',
-    defaults={'deleted_changes_id': None},
-    methods=['POST']
-)
+def delete_category(repository, deleted_cat_id, redirect_to):
+    """
+        View that handles deleting a given category for a given repo
+    """
+    if repository not in app.config["PERSISTENCE_CONFIG"]["REPOSITORY_LIST"]:
+        abort(404)
+
+    check_user_status_and_repo_access(repository)
+    
+    cat_api_instance = CategoryAPI()
+    if deleted_cat_id is not None:
+        cat_api_instance.delete(
+            repository=repository,
+            deleted_cat_id=deleted_cat_id
+        )
+    return redirect(url_for('categories.'+redirect_to, repository=repository))
+
+
 @module.route(
-    '/<string:repository>/submit',
-    defaults={'deleted_cat_id': None, 'deleted_changes_id': None},
-    methods=['GET', 'POST']
+    '/<string:repository>/submit', methods=['GET']
 )
-def submit(repository, deleted_cat_id, deleted_changes_id):
+def submit(repository):
     """
         View that handles all the visualisation of changes for a user's
         session, links to the editor forms, allows the users to cancel their
@@ -120,76 +111,61 @@
 
     check_user_status_and_repo_access(repository)
 
+    commit_form = CommitForm(request.form)
+    
+    cat_list = get_current_category_list(repository=repository)
+    original_cat_list = get_current_category_list(
+        repository=repository,
+        with_local_changes=False
+    )
+
+    created_cat_count = len([
+        created_cat for created_cat in cat_list
+        if created_cat["state"] == "created"
+    ])
+    edited_cat_count = len([
+        edited_cat for edited_cat in cat_list
+        if edited_cat["state"] == "modified"
+    ])
+    deleted_cat_count = len([
+        deleted_cat for deleted_cat in cat_list
+        if deleted_cat["state"] == "deleted"
+    ])
+
+    return render_template('categories/submit.html',
+                           cat_list=cat_list,
+                           original_cat_list=original_cat_list,
+                           original_cat_count=len(original_cat_list),
+                           created_cat_count=created_cat_count,
+                           edited_cat_count=edited_cat_count,
+                           deleted_cat_count=deleted_cat_count,
+                           commit_form=commit_form,
+                           current_repository=repository)
+
+
+@module.route(
+    '/<string:repository>/push_changes', methods=['POST']
+)
+def push_changes(repository):
+    """
+        View that handles POST from the submit page
+    """
+    if repository not in app.config["PERSISTENCE_CONFIG"]["REPOSITORY_LIST"]:
+        abort(404)
+
+    check_user_status_and_repo_access(repository)
+    
     cat_api_instance = CategoryAPI()
     cat_changes_api_instance = CategoryChangesAPI()
-
-    if deleted_cat_id is None and deleted_changes_id is None:
-
-        commit_form = CommitForm(request.form)
-
-        # If it's a POST with no delete_cat_id and delete_modifs_id, then we
-        # will submit all the stored changes
-        if request.method == "POST":
-            if commit_form.validate_on_submit():
-                cat_api_instance.put(repository=repository, message=commit_form.commit_message.data)
-                cat_changes_api_instance.delete(repository=repository)
-            return redirect(url_for('categories.workshop', repository=repository))
-
-        # if it's a GET with no delete_cat_id or deleted_changes_id, then we'll
-        # display the changes
-        elif request.method == "GET":
-            cat_list = get_current_category_list(repository=repository)
-            original_cat_list = get_current_category_list(
-                repository=repository,
-                with_local_changes=False
-            )
-
-            created_cat_count = len([
-                created_cat for created_cat in cat_list
-                if created_cat["state"] == "created"
-            ])
-            edited_cat_count = len([
-                edited_cat for edited_cat in cat_list
-                if edited_cat["state"] == "modified"
-            ])
-            deleted_cat_count = len([
-                deleted_cat for deleted_cat in cat_list
-                if deleted_cat["state"] == "deleted"
-            ])
-
-            return render_template('categories/submit.html',
-                                   cat_list=cat_list,
-                                   original_cat_list=original_cat_list,
-                                   original_cat_count=len(original_cat_list),
-                                   created_cat_count=created_cat_count,
-                                   edited_cat_count=edited_cat_count,
-                                   deleted_cat_count=deleted_cat_count,
-                                   commit_form=commit_form,
-                                   current_repository=repository)
-
-    # One of the ids is not None (either deleting a category or a modification)
+    
+    commit_form = CommitForm(request.form)
+    
+    if commit_form.validate_on_submit():
+        cat_api_instance.put(repository=repository, message=commit_form.commit_message.data)
+        cat_changes_api_instance.delete(repository=repository)
+        return redirect(url_for('categories.workshop', repository=repository))
     else:
-        # We only do that if we have a POST
-        if request.method == "POST":
-            # We identify if we want to delete a change
-            if deleted_changes_id is not None:
-                cat_changes_api_instance.delete(
-                    repository=repository,
-                    modified_cat_id=deleted_changes_id
-                )
-            # We identify if we want to delete a category
-            elif deleted_cat_id is not None:
-                cat_api_instance.delete(
-                    repository=repository,
-                    deleted_cat_id=deleted_cat_id
-                )
-            return redirect(
-                url_for('categories.submit', repository=repository)
-            )
-        else:
-            return redirect(
-                url_for('home.index')
-            )
+        return redirect(url_for('categories.submit', repository=repository))
 
 
 @module.route('/<string:repository>/editor',
@@ -304,14 +280,19 @@
             cat_form.label.data = current_cat.label
             cat_form.description.data = current_cat.description
             for (cat_predicate, cat_object) in current_cat_properties:
-                if get_property_list()[repository][cat_predicate.toPython()]["object_type"] == "uriref-category":
-                    namespace, object_id = cat_object.split("#", 1)
+                can_append = True
+                if get_property_list()[repository][cat_predicate.toPython()]["object_type"] == "uriref-category":             
+                    if "#" in cat_object:
+                        namespace, object_id = cat_object.split("#", 1)
+                    else:
+                        can_append = False
                 else:
                     object_id = cat_object
-                cat_form.properties.append_entry({
-                    "property_predicate": cat_predicate.toPython(),
-                    "property_object": object_id
-                })
+                if can_append:
+                    cat_form.properties.append_entry({
+                        "property_predicate": cat_predicate.toPython(),
+                        "property_object": object_id
+                    })
         # list of category that will be used in property editor, list of dict
         # {"cat_id": cat.cat_id,
         #  "cat_label": cat.label,
@@ -339,7 +320,6 @@
                  cat_property["property_object"])
                 for cat_property in cat_form.properties.data
             ]
-
             if cat_id is not None:
                 #TODO: vérifier encoding - logger.debug(str(cat_data))
                 cat_api_instance.put(
--- a/src/catedit/views/forms.py	Thu Apr 16 21:23:49 2015 +0200
+++ b/src/catedit/views/forms.py	Fri Apr 17 10:45:30 2015 +0200
@@ -5,7 +5,7 @@
 from flask_wtf import Form
 from wtforms import StringField, TextAreaField, FormField, \
                     FieldList, HiddenField
-from wtforms.validators import DataRequired, Optional, AnyOf
+from wtforms.validators import DataRequired, Optional
 
 
 class CommitForm(Form):