# HG changeset patch # User Nicolas DURAND # Date 1420240551 -3600 # Node ID b1b002c5ff60a7443c02413ae8191ccdbd7f914a # Parent d47f8f8b3faf97d07270187621898abb0999390f Added support for multiple repositories + Started work on template inheritance (only created empty base template so far) diff -r d47f8f8b3faf -r b1b002c5ff60 src/catedit/models.py --- a/src/catedit/models.py Fri Jan 02 16:46:56 2015 +0100 +++ b/src/catedit/models.py Sat Jan 03 00:15:51 2015 +0100 @@ -177,7 +177,7 @@ deleted categories and save the changes using the persistence method * delete_category will delete a single category from its id """ - def __init__(self, persistence_method): + def __init__(self, persistence_method, repository=""): """ persistence_method is a class that must have 4 methods: diff -r d47f8f8b3faf -r b1b002c5ff60 src/catedit/persistence.py --- a/src/catedit/persistence.py Fri Jan 02 16:46:56 2015 +0100 +++ b/src/catedit/persistence.py Sat Jan 03 00:15:51 2015 +0100 @@ -143,6 +143,9 @@ * message : when saving or deleting, commit message to be saved to Github """ + def __init__(self, **kwargs): + self.repository = kwargs.get("repository", "") + @property def session_compliant(self): """ @@ -194,28 +197,60 @@ modification_list = kwargs["modification_list"] # point 1 - ref_master = github.get("repos/" - + app.config["REPOSITORY_OWNER"] + "/" - + app.config["REPOSITORY_NAME"] - + "/git/refs/heads/master") - logger.debug(str(ref_master)) + try: + ref_master = github.get( + "repos/" + + app.config["REPOSITORY_OWNER"] + "/" + + self.repository + + "/git/refs/heads/master" + ) + logger.debug(str(ref_master)) + except GitHubError as ghe: + logger.debug("GitHubError trying to get the reference \ + to the master branch") + logger.debug( + "Endpoint: " + + "repos/" + + app.config["REPOSITORY_OWNER"] + "/" + + self.repository + + "/git/refs/heads/master" + ) + logger.debug(ghe.response.text) + logger.debug(str(github.get("rate_limit")["resources"])) # point 2 - last_commit_master = github.get("repos/" - + app.config["REPOSITORY_OWNER"] + "/" - + app.config["REPOSITORY_NAME"] - + "/git/commits/" - + ref_master["object"]["sha"]) - logger.debug(str(last_commit_master)) + try: + last_commit_master = github.get( + "repos/" + + app.config["REPOSITORY_OWNER"] + "/" + + self.repository + + "/git/commits/" + + ref_master["object"]["sha"] + ) + logger.debug(str(last_commit_master)) + except GitHubError as ghe: + logger.debug("GitHubError trying to get the commit associated \ + to the latest reference to the master branch") + logger.debug(ghe.response.text) + logger.debug(str(github.get("rate_limit")["resources"])) # Point 3 - last_commit_tree = github.get("repos/" - + app.config["REPOSITORY_OWNER"] + "/" - + app.config["REPOSITORY_NAME"] - + "/git/trees/" - + last_commit_master["tree"]["sha"] - + "?recursive=1") - logger.debug(str(last_commit_tree)) + try: + last_commit_tree = github.get( + "repos/" + + app.config["REPOSITORY_OWNER"] + "/" + + self.repository + + "/git/trees/" + + last_commit_master["tree"]["sha"] + + "?recursive=1" + ) + logger.debug(str(last_commit_tree)) + except GitHubError as ghe: + logger.debug("GitHubError trying to get the tree from the commit \ + associated to the latest reference to the master \ + branch") + logger.debug(ghe.response.text) + logger.debug(str(github.get("rate_limit")["resources"])) # Point 4 new_tree_data = {"tree": []} @@ -255,15 +290,24 @@ "content": category["content"], "encoding": "utf-8" } - new_blob = github.post( - "repos/" - + app.config["REPOSITORY_OWNER"] + "/" - + app.config["REPOSITORY_NAME"] - + "/git/blobs", - data=new_blob_data - ) - blob_sha = new_blob["sha"] - break + try: + new_blob = github.post( + "repos/" + + app.config["REPOSITORY_OWNER"] + "/" + + self.repository + + "/git/blobs", + data=new_blob_data + ) + blob_sha = new_blob["sha"] + break + except GitHubError as ghe: + logger.debug( + "GitHubError trying to post a new \ + blob with following data: " + + str(new_blob_data) + ) + logger.debug(ghe.response.text) + logger.debug(str(github.get("rate_limit")["resources"])) # this means element is an untouched file so we just get # its sha @@ -287,11 +331,22 @@ # 4-1 for added files, creating a new blob new_blob_data = {"content": category["content"], "encoding": "utf-8"} - new_blob = github.post("repos/" - + app.config["REPOSITORY_OWNER"] + "/" - + app.config["REPOSITORY_NAME"] - + "/git/blobs", - data=new_blob_data) + try: + new_blob = github.post( + "repos/" + + app.config["REPOSITORY_OWNER"] + "/" + + self.repository + + "/git/blobs", + data=new_blob_data + ) + except GitHubError as ghe: + logger.debug( + "GitHubError trying to post a new blob with following \ + data: " + + str(new_blob_data) + ) + logger.debug(ghe.response.text) + logger.debug(str(github.get("rate_limit")["resources"])) new_tree_data["tree"].append({ "path": app.config["CATEGORIES_PATH"] + category["name"], "mode": "100644", @@ -301,33 +356,64 @@ logger.debug(str(new_tree_data)) # Finally, we post the new tree - new_tree_response = github.post("repos/" - + app.config["REPOSITORY_OWNER"]+"/" - + app.config["REPOSITORY_NAME"] - + "/git/trees", - data=new_tree_data) + try: + new_tree_response = github.post( + "repos/" + + app.config["REPOSITORY_OWNER"]+"/" + + self.repository + + "/git/trees", + data=new_tree_data + ) + except GitHubError as ghe: + logger.debug( + "GitHubError trying to post a new tree with following data: " + + str(new_tree_data) + ) + logger.debug(ghe.response.text) # Point 5 new_commit_data = {"message": kwargs["message"], "parents": [last_commit_master["sha"]], "tree": new_tree_response["sha"]} logger.debug(str(new_commit_data)) - new_commit = github.post("repos/" - + app.config["REPOSITORY_OWNER"]+"/" - + app.config["REPOSITORY_NAME"] - + "/git/commits", - data=new_commit_data) - logger.debug(str(new_commit)) + try: + new_commit = github.post( + "repos/" + + app.config["REPOSITORY_OWNER"]+"/" + + self.repository + + "/git/commits", + data=new_commit_data + ) + logger.debug(str(new_commit)) + except GitHubError as ghe: + logger.debug( + "GitHubError trying to post a new commit with following data: " + + str(new_commit_data) + ) + logger.debug(ghe.response.text) + logger.debug(str(github.get("rate_limit")["resources"])) # Point 6 new_head_data = {"sha": new_commit["sha"], "force": "true"} logger.debug(str(new_head_data)) - new_head = github.patch("repos/" - + app.config["REPOSITORY_OWNER"] + "/" - + app.config["REPOSITORY_NAME"] - + "/git/refs/heads/master", - data=json.dumps(new_head_data)) - logger.debug(str(new_head)) + try: + new_head = github.patch( + "repos/" + + app.config["REPOSITORY_OWNER"] + "/" + + self.repository + + "/git/refs/heads/master", + data=json.dumps(new_head_data) + ) + logger.debug(str(new_head)) + except GitHubError as ghe: + logger.debug( + "GitHubError trying to edit the head to the master branch \ + with the following data: " + + str(new_head_data) + ) + logger.debug(ghe.response.text) + logger.debug(str(github.get("rate_limit")["resources"])) + def load(self, **kwargs): """ @@ -336,7 +422,7 @@ try: filedict = github.get("repos/" + app.config["REPOSITORY_OWNER"]+"/" - + app.config["REPOSITORY_NAME"] + + self.repository + "/contents/" + app.config["CATEGORIES_PATH"] + kwargs["name"]) @@ -346,6 +432,7 @@ logger.debug("Github sent an error, if 404, either you may not \ have access to the repository or it doesn't exist ") logger.debug(ghe.response.text) + logger.debug(str(github.get("rate_limit")["resources"])) return file_content def delete(self, **kwargs): @@ -367,7 +454,7 @@ try: files_in_repo = github.get("repos/" + app.config["REPOSITORY_OWNER"]+"/" - + app.config["REPOSITORY_NAME"] + + self.repository + "/contents/" + app.config["CATEGORIES_PATH"]) filenames_list = [github_file["name"] @@ -380,13 +467,14 @@ may not have access to the repository or it doesn't \ exist or there isn't any files in it") logger.debug(ghe.response.text) + logger.debug(str(github.get("rate_limit")["resources"])) file_content_list = [] for filename in filenames_list: try: filedict = github.get("repos/" + app.config["REPOSITORY_OWNER"]+"/" - + app.config["REPOSITORY_NAME"] + + self.repository + "/contents/" + app.config["CATEGORIES_PATH"] + filename) @@ -395,5 +483,6 @@ except GitHubError as ghe: logger.debug("Github Error trying to get file: "+filename) logger.debug(ghe.response.text) + logger.debug(str(github.get("rate_limit")["resources"])) # logger.debug(file_content_list) return file_content_list diff -r d47f8f8b3faf -r b1b002c5ff60 src/catedit/resources.py --- a/src/catedit/resources.py Fri Jan 02 16:46:56 2015 +0100 +++ b/src/catedit/resources.py Sat Jan 03 00:15:51 2015 +0100 @@ -33,13 +33,16 @@ when successful """ @cache.memoize(timeout=3600) - def get(self, cat_id=None): + def get(self, repository, cat_id=None): """ API to get the category of id cat_id, or if cat_id is None, get the list of category """ cat_manager_instance = CategoryManager( - getattr(catedit.persistence, app.config["PERSISTENCE_METHOD"])() + getattr( + catedit.persistence, + app.config["PERSISTENCE_METHOD"] + )(repository=repository), ) if cat_id is not None: cat = cat_manager_instance.load_category(cat_id) @@ -52,25 +55,28 @@ return response # update category cat_id - def put(self, cat_id=None): + def put(self, repository, cat_id=None): """ API to edit the category of id cat_id * If None and persistence support change sets, will submit all changes to category list """ cat_manager_instance = CategoryManager( - getattr(catedit.persistence, app.config["PERSISTENCE_METHOD"])() + getattr( + catedit.persistence, + app.config["PERSISTENCE_METHOD"] + )(repository=repository), ) args = cat_parser.parse_args() if (cat_id is None): if (cat_manager_instance.persistence.session_compliant is True): logger.debug("Submitting - deleted categories are:" - + str(session.get("deleted_categories", [])) + + str(session.get("deleted_categories", {}).get(repository, [])) + " and modified categories are:" - + str(session.get("modified_categories", []))) + + str(session.get("modified_categories", {}).get(repository, []))) cat_manager_instance.save_changes( - deleted_cat_list = session.get("deleted_categories", []), - modified_cat_list = session.get("modified_categories", []), + deleted_cat_list = session.get("deleted_categories", {}).get(repository, []), + modified_cat_list = session.get("modified_categories", {}).get(repository, []), message=args["commit_message"] ) else: @@ -98,8 +104,8 @@ # is the edition occuring on an already modified category? if cat_id in [category["name"] for category - in session.get("modified_categories", [])]: - for element in session.get("modified_categories", []): + in session.get("modified_categories", {}).get(repository, [])]: + for element in session.get("modified_categories", {}).get(repository, []): if element["name"] == cat_id: cat_graph = Graph() cat_graph.parse( @@ -114,11 +120,11 @@ new_label=args["label"], new_other_properties=new_property_list) - session["modified_categories"][:] = [ - elt for elt in session.get("modified_categories", []) + session["modified_categories"][repository][:] = [ + elt for elt in session.get("modified_categories", {}).get(repository, []) if elt["name"] != cat.cat_id ] - session["modified_categories"].append( + session["modified_categories"][repository].append( {"name": cat.cat_id, "content": str( cat.cat_graph.serialize(format="turtle"), "utf-8" @@ -127,15 +133,15 @@ # Now we must clean the deleted categories list in case the # modified category was deleted before being edited - for element in session.get("deleted_categories", []): + for element in session.get("deleted_categories", {}).get(repository, []): if element["name"] == cat.cat_id: - session["deleted_categories"].remove(element) + session["deleted_categories"][repository].remove(element) logger.debug("put id: "+cat.cat_id) cache.clear() return 204 - def post(self): + def post(self, repository): """ API to create a new category """ @@ -161,11 +167,11 @@ description=args["description"], other_properties=property_list) - session["modified_categories"][:] = [ - elt for elt in session.get("modified_categories", []) + session["modified_categories"][repository][:] = [ + elt for elt in session.get("modified_categories", {}).get(repository, []) if elt["name"] != cat.cat_id ] - session["modified_categories"].append( + session["modified_categories"][repository].append( {"name": cat.cat_id, "content": str( cat.cat_graph.serialize(format="turtle"), "utf-8" @@ -176,39 +182,39 @@ cache.clear() return cat.cat_graph.serialize(format='turtle').decode("utf-8"), 201 - def delete(self, deleted_cat_id): + def delete(self, repository, deleted_cat_id): """ API to delete the category of id cat_id or restore it from the deletion list """ if (deleted_cat_id in [ - element["name"] for element in session.get("deleted_categories", []) + element["name"] for element in session.get("deleted_categories", {}).get(repository, []) ]): - session["deleted_categories"].remove({"name": deleted_cat_id}) + session["deleted_categories"][repository].remove({"name": deleted_cat_id}) # warning, not safe if 2 files share the same name (or category id) # but that shouldn't happen else: - session["deleted_categories"].append({"name": deleted_cat_id}) + session["deleted_categories"][repository].append({"name": deleted_cat_id}) # now we must clean the modified categories list in case the # deleted category was modified before - for element in session.get("modified_categories", []): + for element in session.get("modified_categories", {}).get(repository, []): if element["name"] == deleted_cat_id: - session["modified_categories"].remove(element) + session["modified_categories"][repository].remove(element) # Now we also have to clean up categories that reference the # deleted category cat_manager_instance = CategoryManager( getattr( - catedit.persistence, app.config["PERSISTENCE_METHOD"] - )() + catedit.persistence, + app.config["PERSISTENCE_METHOD"] + )(repository=repository), ) cat_list = cat_manager_instance.list_categories() # first we edit what was already modified before the deletion - logger.debug(session["modified_categories"]) - element_list = list(session.get("modified_categories", [])) + logger.debug(session["modified_categories"][repository]) + element_list = list(session.get("modified_categories", {}).get(repository, [])) if deleted_cat_id in [element["name"] for - element in session.get("deleted_categories", - [])]: + element in session.get("deleted_categories", {}).get(repository, [])]: for element in element_list: logger.debug(str(element)) modified_cat_graph = Graph() @@ -236,13 +242,13 @@ modified_cat.edit_category( new_other_properties=new_property_list ) - session["modified_categories"][:] = [ + session["modified_categories"][repository][:] = [ elt for elt in session.get( "modified_categories", [] ) if elt["name"] != modified_cat.cat_id ] - session["modified_categories"].append( + session["modified_categories"][repository].append( {"name": modified_cat.cat_id, "content": str( modified_cat.cat_graph @@ -255,10 +261,10 @@ for cat in cat_list: if cat.cat_id not in [ element["name"] for element in - session.get("modified_categories", []) + session.get("modified_categories", {}).get(repository, []) ] and cat.cat_id not in [ element["name"] for element in - session.get("deleted_categories", []) + session.get("deleted_categories", {}).get(repository, []) ]: new_property_list = [] for (predicate, obj) in cat.properties: @@ -277,13 +283,13 @@ cat.edit_category( new_other_properties=new_property_list ) - session["modified_categories"][:] = [ + session["modified_categories"][repository][:] = [ elt for elt in session.get( - "modified_categories", [] - ) + "modified_categories", {} + ).get(repository, []) if elt["name"] != cat.cat_id ] - session["modified_categories"].append( + session["modified_categories"][repository].append( {"name": cat.cat_id, "content": str( cat.cat_graph.serialize(format="turtle"), @@ -301,36 +307,51 @@ succesful if category is a modified one, returns only the cat_id if it is a deleted one - All changes and deletions are saved in session["modified_categories"] - and session["deleted_categories"] + All changes and deletions are saved in session["modified_categories"][repository] + and session["deleted_categories"][repository] """ - def get(self, modified_cat_id=None): + def get(self, repository, modified_cat_id=None): """ API to get the pending changes for category cat_id """ logger.debug(modified_cat_id) - logger.debug(session.get("modified_categories", [])) + logger.debug(str(session.get("modified_categories", {}))) + logger.debug(str(session.get("modified_categories", {}).get(repository, []))) if modified_cat_id is None: return { - "modified_categories": session.get("modified_categories", []), - "deleted_categories": session.get("deleted_categories", []) + "modified_categories": session.get("modified_categories", {}).get(repository, []), + "deleted_categories": session.get("deleted_categories", {}).get(repository, []) }, 201 else: - for category in session.get("modified_categories", []): + for category in session.get("modified_categories", {}).get(repository, []): logger.debug(category) if category["name"] == modified_cat_id: return { "type": "modified", "category": category }, 201 - for category in session.get("deleted_categories", []): + for category in session.get("deleted_categories", {}).get(repository, []): logger.debug(category) if category["name"] == modified_cat_id: return { "type": "deleted", "category": category }, 201 return 404 - def delete(self, cat_id=None): + def delete(self, repository, modified_cat_id=None): """ API to delete the category cat_id from the changelist or if cat_id is None, delete the whole changelist """ - session["modified_categories"] = [] - session["deleted_categories"] = [] + if modified_cat_id is not None: + session["modified_categories"][repository][:] = [ + elt for elt in session.get( + "modified_categories", {} + ).get(repository, []) + if elt["name"] != modified_cat_id + ] + session["deleted_categories"][repository][:] = [ + elt for elt in session.get( + "modified_categories", {} + ).get(repository, []) + if elt["name"] != modified_cat_id + ] + else: + session["modified_categories"][repository] = [] + session["deleted_categories"][repository] = [] return 204 diff -r d47f8f8b3faf -r b1b002c5ff60 src/catedit/static/css/style.css --- a/src/catedit/static/css/style.css Fri Jan 02 16:46:56 2015 +0100 +++ b/src/catedit/static/css/style.css Sat Jan 03 00:15:51 2015 +0100 @@ -24,3 +24,20 @@ { display: inline; } + +.navbar-form +{ + width: 300px; + vertical-align: center; + display: inline-block; +} + +.select-repo +{ + float:right; +} + +.navbar-decorative,.navbar-decorative:hover +{ + color:blue; +} diff -r d47f8f8b3faf -r b1b002c5ff60 src/catedit/templates/catbase.html diff -r d47f8f8b3faf -r b1b002c5ff60 src/catedit/templates/cateditor.html --- a/src/catedit/templates/cateditor.html Fri Jan 02 16:46:56 2015 +0100 +++ b/src/catedit/templates/cateditor.html Sat Jan 03 00:15:51 2015 +0100 @@ -31,17 +31,28 @@ + {% if session["user_logged"] %} + + {% endif %}
+

CatEdit - {{current_repository}}

{% if session["user_logged"] and not session["user_can_edit"] %} {% endif %} -

{% if cat_id: %} Edition : Catégorie existante{% else %}Création : Nouvelle catégorie{% endif %}

+

{% if cat_id: %} Edition : Catégorie existante{% else %}Création : Nouvelle catégorie{% endif %}

{% if readonly %}
{% endif %} -
+ {{ form.hidden_tag() }} {% if form.label.errors %} {% set label_placeholder="Champ obligatoire" %} @@ -151,7 +162,7 @@


- Annuler + Annuler {% if readonly %} {% endif %} diff -r d47f8f8b3faf -r b1b002c5ff60 src/catedit/templates/catindex.html --- a/src/catedit/templates/catindex.html Fri Jan 02 16:46:56 2015 +0100 +++ b/src/catedit/templates/catindex.html Sat Jan 03 00:15:51 2015 +0100 @@ -39,14 +39,21 @@ @@ -60,10 +67,10 @@ s'inscrire sur Github

- Une fois authentifié, l'édition se fait en utilisant l'onglet Atelier. - Vous pourrez y trouver la liste des catégories existantes (pour l'instant, - l'outil ne porte que sur un unique ensemble de catégories) présentée dans - un tableau qui initialement ne comprend que les catégories de l'état courant. + Une fois authentifié, choisissez un ensemble de catégorie dans la liste se trouvant + dans la barre de navigation pour être redirigé vers l'atelier correspondant. + Vous pourrez y trouver la liste des catégories existantes pour cet ensemble, + présentée dans un tableau qui initialement ne comprend que les catégories de l'état courant.

L'état courant de l'ensemble de catégorie est la base à partir de laquelle diff -r d47f8f8b3faf -r b1b002c5ff60 src/catedit/templates/catmodifs.html --- a/src/catedit/templates/catmodifs.html Fri Jan 02 16:46:56 2015 +0100 +++ b/src/catedit/templates/catmodifs.html Sat Jan 03 00:15:51 2015 +0100 @@ -62,18 +62,28 @@

+ {% if session["user_logged"] %} + + {% endif %}
-

CatEdit - {{config.get("REPOSITORY_NAME", "Titre-Ensemble-Catégories")}}

+

CatEdit - {{current_repository}}

Catégories existantes

@@ -94,7 +104,7 @@ {% else %} {% if cat_list|length == 0 %} - + {% else %} {% for cat in cat_list %} @@ -106,11 +116,11 @@ {% if cat.cat_id not in deleted_cat_namelist and cat.cat_id not in modified_cat_namelist %} @@ -221,7 +231,7 @@
- +
@@ -252,7 +262,7 @@
@@ -282,7 +292,7 @@
- +
@@ -315,7 +325,7 @@
Aucune catégorie n'a été créée pour l'instant. {% if not readonly %}Créer une catégorie{% endif %}Aucune catégorie n'a été créée pour l'instant. {% if not readonly %}Créer une catégorie{% endif %}
- + -
+
{{ cat.cat_description}} - +
{{ cat.cat_description}} - +
{{ existing_cat.cat_label }} Cette catégorie va être supprimée quand vous soumettrez vos modifications. - +
@@ -331,7 +341,7 @@

Soumettre mes changements

- +
{{ commit_form.hidden_tag() }}
@@ -339,7 +349,7 @@ {{ commit_form.commit_message(size=40, class="form-control", readonly=readonly) }}
- Retour + Retour

diff -r d47f8f8b3faf -r b1b002c5ff60 src/catedit/templates/catrecap.html --- a/src/catedit/templates/catrecap.html Fri Jan 02 16:46:56 2015 +0100 +++ b/src/catedit/templates/catrecap.html Sat Jan 03 00:15:51 2015 +0100 @@ -47,12 +47,21 @@ {% if not session.get("user_logged", None)%}Non authentifié - S'authentifier {% else %} Authentifié: {{ session["user_login"] }} - Quitter{% endif %}
+ {% if session["user_logged"] %} + + {% endif %}
-

CatEdit - {{config.get("REPOSITORY_NAME", "Titre-Ensemble-Catégories")}}

-

Créer une catégorie :

+

CatEdit - {{current_repository}}

+

Créer une catégorie :

{% if session["user_logged"] and not session["user_can_edit"] %}