diff --git a/frontend/templates/project/map-person.html b/frontend/templates/project/map-person.html
index 0d52185..b72189e 100644
--- a/frontend/templates/project/map-person.html
+++ b/frontend/templates/project/map-person.html
@@ -4,6 +4,7 @@
{% endblock %}
{% block navbar-header %}
Back to projects
+ Back to person list
{% endblock %}
{% block content %}
Current subject:
diff --git a/frontend/views.py b/frontend/views.py
index f109e05..db4eea4 100644
--- a/frontend/views.py
+++ b/frontend/views.py
@@ -190,7 +190,6 @@ class ProjectPersonView(ProtectedFormView, SingleObjectMixin):
def get_context_data(self, **kwargs):
project = self.object
-
kwargs[u'unmapped_persons'] = person_mapper.get_unmapped_identities(project)
kwargs[u'mapped_persons'] = person_mapper.get_mapped_identities(project)
return super(ProjectPersonView, self).get_context_data(**kwargs)
@@ -217,18 +216,44 @@ class ProjectMapPersonView(ProtectedFormView, SingleObjectMixin):
success_url = u'/project'
+ _unmapped_persons = None
+
+ def _refresh_unmapped(self):
+ """ Refresh data about unmapped persons. """
+ self._unmapped_persons = person_mapper.get_unmapped_identities(self.object)
+
+ def _is_unmapped(self, person_uuid):
+ """ Returns True if the given person is not mapped yet. """
+ if not self._unmapped_persons:
+ self._refresh_unmapped()
+ return person_uuid in self._unmapped_persons
+
def get_context_data(self, **kwargs):
project = self.object
kwargs[u'person'] = person_mapper.get_person_by_uuid(project, self.person_uuid)
return super(ProjectMapPersonView, self).get_context_data(**kwargs)
def get_success_url(self):
- unmapped_persons = person_mapper.get_unmapped_identities(self.object)
- project_id = self.object.id
- person = unmapped_persons.itervalues().next()
+ """ TODO: Make this work! - Update success uri to next unmapped person. """
+ last_uuid = unicode(self.person_uuid)
+ self._refresh_unmapped()
+ unmapped = self._unmapped_persons.items()
+ first_person_uuid = unmapped[0][0]
+ next_uuid = first_person_uuid
+ unmapped.reverse()
+
+ while True:
+ try:
+ current_person = unmapped.pop()
+ if current_person[1].ID == last_uuid:
+ next_uuid = unmapped.pop()[0]
+ break
+ except IndexError:
+ break
+
kwargs = {
- u"project_id": project_id,
- u"person_uuid": person.ID
+ u"project_id": self.object.id,
+ u"person_uuid": next_uuid
}
return reverse('frontend-project-map-person', kwargs=kwargs)
@@ -236,13 +261,18 @@ class ProjectMapPersonView(ProtectedFormView, SingleObjectMixin):
self.project_id = kwargs[u'project_id']
self.person_uuid = kwargs[u'person_uuid']
self.object = Project.objects.get(pk=self.project_id)
+ if self._is_unmapped(self.person_uuid) == False:
+ raise Exception("Sorry, this person was already mapped. Try deleting the existing mapping and move on. TODO: Make this more beautiful.")
+ self._refresh_unmapped()
return super(ProjectMapPersonView, self).get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
self.project_id = kwargs[u'project_id']
self.person_uuid = kwargs[u'person_uuid']
self.object = Project.objects.get(pk=self.project_id)
- # self.success_url = self.success_url + self.project_id + '/update'
+ if self._is_unmapped(self.person_uuid) == False:
+ raise Exception("Sorry, this person was already mapped. Try deleting the existing mapping and move on. TODO: Make this more beautiful.")
+ self._refresh_unmapped()
return super(ProjectMapPersonView, self).post(request, *args, **kwargs)
def form_valid(self, form, *args, **kwargs):
diff --git a/service/Citavi.py b/service/Citavi.py
index 00ba9bf..ac73b42 100644
--- a/service/Citavi.py
+++ b/service/Citavi.py
@@ -1,10 +1,9 @@
# -*- coding: utf-8 -*-
-from sqlalchemy import create_engine, MetaData
+from sqlalchemy import create_engine, MetaData, asc, desc
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import Session, scoped_session, sessionmaker
-
class Project():
""" A helper class representing a Citavi project. """
def __init__(self, sqlite_file):
@@ -26,7 +25,7 @@ class Project():
""" Returns all persons from the Citavi project. """
try:
person_class = self._sa_sqlite_autobase.classes.Person
- citavi_persons = self._sa_sqlite_session.query(person_class).all()
+ citavi_persons = self._sa_sqlite_session.query(person_class).order_by(asc('ID')).all()
return citavi_persons
except Exception, e:
print e
diff --git a/service/Mapper.py b/service/Mapper.py
index d6bbcb6..82a16b6 100644
--- a/service/Mapper.py
+++ b/service/Mapper.py
@@ -2,7 +2,7 @@
from Citavi import ProjectManager
from Django import PersonIdentityManager
-
+from collections import OrderedDict
class PersonMapper():
""" This little guy will help you get through your day and map citavi persons against identities. """
@@ -25,7 +25,7 @@ class PersonMapper():
citavi_persons = self._citavi_project_manager.get_persons_from_project(project.id)
mapped_persons = self._person_identity_manager.get_mapped_identities_for_project(project)
# Prepare citavi_persons into a uuid->person dict, then eliminate mapped ones. This is ugly and a little slow.
- citavi_uuid_dict = {}
+ citavi_uuid_dict = OrderedDict()
for person in citavi_persons:
citavi_uuid_dict[person.ID] = person
if len(mapped_persons) == 0:
@@ -38,7 +38,7 @@ class PersonMapper():
def get_mapped_identities(self, project):
""" Returns a uuid->person dict for all mapped persons within a project. """
mapped_persons = self._person_identity_manager.get_mapped_identities_for_project(project)
- mapped_uuid_dict = {}
+ mapped_uuid_dict = OrderedDict()
for person in mapped_persons:
mapped_uuid_dict[person.citavi_uuid] = person
return mapped_uuid_dict