From 4ab14678455b46f6fb3acdd12e5397b1bf7bd493 Mon Sep 17 00:00:00 2001 From: Doug Blank Date: Tue, 10 Nov 2009 05:28:35 +0000 Subject: [PATCH] New files for gramps webapp; src/data/templates contains html templates, and src/gen/web contains gramps-Django interface svn: r13542 --- src/data/templates/gramps-base.html | 55 + src/data/templates/main_page.html | 26 + .../templates/person_detail-one name.html | 31 + src/data/templates/person_detail.html | 69 + src/data/templates/places.html | 9 + src/data/templates/pname.html | 49 + src/data/templates/registration/login.html | 35 + .../templates/successful_data_change.html | 9 + src/data/templates/table_header.html | 5 + src/data/templates/user_page.html | 20 + src/data/templates/view_detail_page.html | 10 + src/data/templates/view_events.html | 34 + src/data/templates/view_family.html | 34 + src/data/templates/view_navigation.html | 13 + src/data/templates/view_page.html | 81 ++ src/data/templates/view_person.html | 41 + src/data/templates/view_repository.html | 34 + src/gen/web/Makefile | 39 + src/gen/web/README | 209 +++ src/gen/web/__init__.py | 0 src/gen/web/djangodb.py | 249 ++++ src/gen/web/forms.py | 69 + src/gen/web/grampsdb/__init__.py | 0 src/gen/web/grampsdb/admin.py | 6 + src/gen/web/grampsdb/models.py | 873 ++++++++++++ src/gen/web/grampsdb/templatetags/__init__.py | 0 src/gen/web/grampsdb/templatetags/my_tags.py | 148 ++ src/gen/web/grampsdb/views.py | 125 ++ src/gen/web/init.py | 92 ++ src/gen/web/init_gramps.py | 11 + src/gen/web/libdjango.py | 1230 +++++++++++++++++ src/gen/web/manage.py | 11 + src/gen/web/settings.py | 73 + src/gen/web/sortheaders.py | 232 ++++ src/gen/web/sqlite.db | Bin 0 -> 707584 bytes src/gen/web/urls.py | 38 + 36 files changed, 3960 insertions(+) create mode 100644 src/data/templates/gramps-base.html create mode 100644 src/data/templates/main_page.html create mode 100644 src/data/templates/person_detail-one name.html create mode 100644 src/data/templates/person_detail.html create mode 100644 src/data/templates/places.html create mode 100644 src/data/templates/pname.html create mode 100644 src/data/templates/registration/login.html create mode 100644 src/data/templates/successful_data_change.html create mode 100644 src/data/templates/table_header.html create mode 100644 src/data/templates/user_page.html create mode 100644 src/data/templates/view_detail_page.html create mode 100644 src/data/templates/view_events.html create mode 100644 src/data/templates/view_family.html create mode 100644 src/data/templates/view_navigation.html create mode 100644 src/data/templates/view_page.html create mode 100644 src/data/templates/view_person.html create mode 100644 src/data/templates/view_repository.html create mode 100644 src/gen/web/Makefile create mode 100644 src/gen/web/README create mode 100644 src/gen/web/__init__.py create mode 100644 src/gen/web/djangodb.py create mode 100644 src/gen/web/forms.py create mode 100644 src/gen/web/grampsdb/__init__.py create mode 100644 src/gen/web/grampsdb/admin.py create mode 100644 src/gen/web/grampsdb/models.py create mode 100644 src/gen/web/grampsdb/templatetags/__init__.py create mode 100644 src/gen/web/grampsdb/templatetags/my_tags.py create mode 100644 src/gen/web/grampsdb/views.py create mode 100644 src/gen/web/init.py create mode 100644 src/gen/web/init_gramps.py create mode 100644 src/gen/web/libdjango.py create mode 100755 src/gen/web/manage.py create mode 100644 src/gen/web/settings.py create mode 100644 src/gen/web/sortheaders.py create mode 100644 src/gen/web/sqlite.db create mode 100644 src/gen/web/urls.py diff --git a/src/data/templates/gramps-base.html b/src/data/templates/gramps-base.html new file mode 100644 index 000000000..88091cad0 --- /dev/null +++ b/src/data/templates/gramps-base.html @@ -0,0 +1,55 @@ +{% load my_tags %} + + + + + {% block title %}GRAMPS Connect{% endblock %} + {% block meta %} + + + + + {% endblock %} + + {% block css %} + + + + + {% endblock %} + + + + +
+
+ {% block content %} + {% endblock %} +
+
+ + + diff --git a/src/data/templates/main_page.html b/src/data/templates/main_page.html new file mode 100644 index 000000000..021c52714 --- /dev/null +++ b/src/data/templates/main_page.html @@ -0,0 +1,26 @@ +{% extends "gramps-base.html" %} + +{% block title %}GRAMPS Connect - main page {% endblock %} +{% block heading %}GRAMPS - main page {% endblock %} + +{% block content %} + +

Welcome to GRAMPS Connect, a new web-based collaboration tool. + +{% if user.is_authenticated %} + You are now logged in + as {{user.username}}. +{% endif %} +

+ +

+Database information: +

+

+ +{% endblock %} + diff --git a/src/data/templates/person_detail-one name.html b/src/data/templates/person_detail-one name.html new file mode 100644 index 000000000..d03eab6c4 --- /dev/null +++ b/src/data/templates/person_detail-one name.html @@ -0,0 +1,31 @@ +{% extends "base.html" %} + +{% block windowtitle %}Person Details{% endblock %} + +{% block pagetitle %}{{Pname}}{% endblock %} + +{% block content %} +
+ + + {% for field in NForm %} +
+ + + + + + {% endfor %} +
Preferred Name
{{ field.label_tag }}: {{ field }}

{{ field.help_text }}

{{ field.errors }}
+ + {% for field in PForm %} +
+ + + + + {% endfor %} +
{{ field.label_tag }}: {{ field }}

{{ field.help_text }}

{{ field.errors }}
+ +
+{% endblock %} \ No newline at end of file diff --git a/src/data/templates/person_detail.html b/src/data/templates/person_detail.html new file mode 100644 index 000000000..fc16e7532 --- /dev/null +++ b/src/data/templates/person_detail.html @@ -0,0 +1,69 @@ +{% extends "base.html" %} + +{% block windowtitle %}Person Details{% endblock %} + +{% block pagetitle %}{{Pname}}{% endblock %} + +{% block content %} +
+ {{ NForm.management_form }} + Names (hide) +
+ + + + + + + + + + + {% for form in NForm.forms %} + + {% for field in form %} + + {% endfor %} + + {% endfor %} + +
Preferred Name?PrefixFirst NameSurnameSuffixType of NameDelete

{{ field }}

+

{{ field.errors }}

{{ NamesetError }}
+ + + + + + + + + + + + + +
Reference ID: {{PForm.gramps_id}}{{PForm.private}} Private Last Changed: {{PLastChanged}} +

{{PForm.last_changed.errors}}

Marker: {{PForm.marker_type}} +

{{PForm.marker_type.errors}}

Gender: {{PForm.gender_type}} +

{{PForm.gender_type.errors}}

Parent in these families: + ( + Edit)

    {% for family in ParentF %} +
  • {{family}}
  • + {% endfor %}

Child in these families: + ( Edit)

    {% for family in ChildF %} +
  • {{family}}
  • + {% endfor %}
+ + + + +
+ +
+{% endblock %} \ No newline at end of file diff --git a/src/data/templates/places.html b/src/data/templates/places.html new file mode 100644 index 000000000..2c6f6202e --- /dev/null +++ b/src/data/templates/places.html @@ -0,0 +1,9 @@ +{% extends "base.html" %} + +{% block windowtitle %}Places{% endblock %} + +{% block pagetitle %}Places{% endblock %} + +{% block content %} + Congratulations, you found Places +{% endblock %} diff --git a/src/data/templates/pname.html b/src/data/templates/pname.html new file mode 100644 index 000000000..bf4ebd875 --- /dev/null +++ b/src/data/templates/pname.html @@ -0,0 +1,49 @@ + {{ NForm.management_form }} + + + + + + + + + + + + {% for form in NForm.forms %} +
+ + {% for field in form %} + + {% endfor %} + + + + + + + {% endfor %} + +{{ NForm.management_form }} +
Names:
{{ field }}
{{ field.label_tag }}: {{ field }}

{{ field.help_text }}

{{ field.errors }}
+ + + + + + + + + {% for form in NForm.forms %} + {% for field in form %} + + {% endfor %} + + + {% endfor %} +
Preferred Name?PrefixFirst NameSurnameSuffixType of NameDelete
{{ field }}

{{ field.errors }}

\ No newline at end of file diff --git a/src/data/templates/registration/login.html b/src/data/templates/registration/login.html new file mode 100644 index 000000000..4833e680b --- /dev/null +++ b/src/data/templates/registration/login.html @@ -0,0 +1,35 @@ +{% extends "gramps-base.html" %} + +{% block title %}GRAMPS Connect - login {% endblock %} +{% block heading %}GRAMPS - login {% endblock %} + +{% block content %} +

User Login

+{% if form.errors %} +

Your username or password were not valid. Please try again.

+{% else %} +

Enter your login ID and password below.

+{% endif %} +
+ + + + + + + + + +
+ + + {{form.username}} +
+ + + {{form.password}} +
+ + +
+{% endblock %} diff --git a/src/data/templates/successful_data_change.html b/src/data/templates/successful_data_change.html new file mode 100644 index 000000000..ad07ad98b --- /dev/null +++ b/src/data/templates/successful_data_change.html @@ -0,0 +1,9 @@ +{% extends "base.html" %} + +{% block windowtitle %}Data Changes Successfully Saved{% endblock %} + +{% block pagetitle %}Data Changes Successfully Saved{% endblock %} + +{% block content %} + Congratulations, your data changes were successful! +{% endblock %} diff --git a/src/data/templates/table_header.html b/src/data/templates/table_header.html new file mode 100644 index 000000000..d3894883b --- /dev/null +++ b/src/data/templates/table_header.html @@ -0,0 +1,5 @@ +{% for header in headers %} + {% if header.sortable %}{% endif %} + {{ header.text }} + {% if header.sortable %}{% endif %} +{% endfor %} diff --git a/src/data/templates/user_page.html b/src/data/templates/user_page.html new file mode 100644 index 000000000..e9cd0d830 --- /dev/null +++ b/src/data/templates/user_page.html @@ -0,0 +1,20 @@ +{% extends "gramps-base.html" %} + +{% block title %}GRAMPS Connect - user page {% endblock %} +{% block heading %}GRAMPS - user page {% endblock %} + +{% block content %} + +

Details for {{user.first_name}} {{user.last_name}} ({{user.username}}):

+ +

+

+

+ +{% endblock %} + diff --git a/src/data/templates/view_detail_page.html b/src/data/templates/view_detail_page.html new file mode 100644 index 000000000..c54349e42 --- /dev/null +++ b/src/data/templates/view_detail_page.html @@ -0,0 +1,10 @@ +{% extends "gramps-base.html" %} +{% block title %}GRAMPS Connect - {{cview}} detail page {% endblock %} +{% block heading %}GRAMPS - {{cview}} detail page {% endblock %} + +{% block content %} + +{{cview}} Detail page. + +{% endblock %} + diff --git a/src/data/templates/view_events.html b/src/data/templates/view_events.html new file mode 100644 index 000000000..e10f81e07 --- /dev/null +++ b/src/data/templates/view_events.html @@ -0,0 +1,34 @@ +{% extends "view_page.html" %} +{% load my_tags %} + +{% block table_data %} + + + + + + + + + + + + + {% for family in page.object_list %} + + + + {% endfor %} + +
Item #IDFatherMotherRelationship
{{ forloop.counter|row_count:page }}[{{family.gramps_id}}] + {{family.father.name_set|make_name:user}} + {{family.mother.name_set|make_name:user}} + {% if user.is_authenticated %} + {{family.family_rel_type|escape}} + {% else %} + [Private] + {% endif %} +
+ +{% endblock %} + diff --git a/src/data/templates/view_family.html b/src/data/templates/view_family.html new file mode 100644 index 000000000..e10f81e07 --- /dev/null +++ b/src/data/templates/view_family.html @@ -0,0 +1,34 @@ +{% extends "view_page.html" %} +{% load my_tags %} + +{% block table_data %} + + + + + + + + + + + + + {% for family in page.object_list %} + + + + {% endfor %} + +
Item #IDFatherMotherRelationship
{{ forloop.counter|row_count:page }}[{{family.gramps_id}}] + {{family.father.name_set|make_name:user}} + {{family.mother.name_set|make_name:user}} + {% if user.is_authenticated %} + {{family.family_rel_type|escape}} + {% else %} + [Private] + {% endif %} +
+ +{% endblock %} + diff --git a/src/data/templates/view_navigation.html b/src/data/templates/view_navigation.html new file mode 100644 index 000000000..569a7f5e4 --- /dev/null +++ b/src/data/templates/view_navigation.html @@ -0,0 +1,13 @@ +{% load my_tags %} + + + +{% table_header %} + + + + {% for view in view_list %} + + {% endfor %} + +
{{ view.name|escape }}
diff --git a/src/data/templates/view_page.html b/src/data/templates/view_page.html new file mode 100644 index 000000000..92eb738fe --- /dev/null +++ b/src/data/templates/view_page.html @@ -0,0 +1,81 @@ +{% extends "gramps-base.html" %} +{% load my_tags %} + +{% block title %}GRAMPS Connect - {{cview}} view page {% endblock %} +{% block heading %}GRAMPS - {{cview}} view page {% endblock %} + +{% block content %} + +

+

+ + +
+

+ + + +

 

+ +{% block table_data %} TABLE DATA GOES HERE {% endblock %} +
+ + + +{% endblock %} diff --git a/src/data/templates/view_person.html b/src/data/templates/view_person.html new file mode 100644 index 000000000..bb8f719eb --- /dev/null +++ b/src/data/templates/view_person.html @@ -0,0 +1,41 @@ +{% extends "view_page.html" %} +{% load my_tags %} + +{% block table_data %} + + + + + + + + + + + + + + + + + {% for name in page.object_list %} + + + + + + {% if user.is_authenticated %} + + + {% else %} + + {% endfor %} + +
Item #NameIDGenderBirth DateDeath Date
{{ forloop.counter|row_count:page }}{{name|make_name:user}} + [{{name.person.gramps_id|escape}}]{{name.person.gender_type|escape}}{{name.person|person_get_birth_date}}{{name.person|person_get_death_date}}[Private] + [Private] + {% endif %} +
+ +{% endblock %} + diff --git a/src/data/templates/view_repository.html b/src/data/templates/view_repository.html new file mode 100644 index 000000000..e10f81e07 --- /dev/null +++ b/src/data/templates/view_repository.html @@ -0,0 +1,34 @@ +{% extends "view_page.html" %} +{% load my_tags %} + +{% block table_data %} + + + + + + + + + + + + + {% for family in page.object_list %} + + + + {% endfor %} + +
Item #IDFatherMotherRelationship
{{ forloop.counter|row_count:page }}[{{family.gramps_id}}] + {{family.father.name_set|make_name:user}} + {{family.mother.name_set|make_name:user}} + {% if user.is_authenticated %} + {{family.family_rel_type|escape}} + {% else %} + [Private] + {% endif %} +
+ +{% endblock %} + diff --git a/src/gen/web/Makefile b/src/gen/web/Makefile new file mode 100644 index 000000000..7a6b9767f --- /dev/null +++ b/src/gen/web/Makefile @@ -0,0 +1,39 @@ +# Initialize GRAMPS Django site + +update: grampsdb/fixtures/initial_data.json + python manage.py syncdb + +grampsdb/fixtures/initial_data.json: + python init.py > grampsdb/fixtures/initial_data.json + +init_gramps: + python init_gramps.py # clear primary and secondary tables + +run: + python manage.py runserver + +sql: + python manage.py sqlall > gramps_sql.txt + +docs: + mkdir -p docs + python manage.py graph_models grampsdb -i Person,Family,Source,Event,Repository,Place,Media,Note -o docs/primary-tables.png + python manage.py graph_models grampsdb -i Note -o docs/note-table.png + python manage.py graph_models grampsdb -i Media -o docs/media-table.png + python manage.py graph_models grampsdb -i Place -o docs/place-table.png + python manage.py graph_models grampsdb -i Repository -o docs/repository-table.png + python manage.py graph_models grampsdb -i Event -o docs/event-table.png + python manage.py graph_models grampsdb -i Source -o docs/source-table.png + python manage.py graph_models grampsdb -i Family -o docs/family-table.png + python manage.py graph_models grampsdb -i Person -o docs/person-table.png + python manage.py graph_models grampsdb -o docs/all-tables.png + python manage.py graph_models grampsdb -i Attribute,Datamap,Name,Lds,Markup,Address,Location,Url -o docs/secondary-tables.png + python manage.py graph_models grampsdb -i Person,Family,Source,Event,Repository,Place,Media,Note,Attribute,Datamap,Name,Lds,Markup,Address,Location,Url -o docs/prim-sec-tables.png + python manage.py graph_models grampsdb -i Person,Family,Source,Event,Repository,Place,Media,Note,Attribute,Datamap,Name,Lds,Markup,Address,Location,Url -o docs/prim-sec-tables.png + python manage.py graph_models grampsdb -i Person,Family,Source,Event,Repository,Place,Media,Note,Attribute,Datamap,Name,Lds,Markup,Address,Location,Url,NoteRef,SourceRef,EventRef,RepositoryRef,PersonRef,ChildRef,MediaRef -o docs/prim-sec-ref-tables.png + + +clean: + rm -f sqlite.db + rm -f *~ *.pyc *.pyo + rm -f grampsdb/fixtures/initial_data.json diff --git a/src/gen/web/README b/src/gen/web/README new file mode 100644 index 000000000..29bb3f571 --- /dev/null +++ b/src/gen/web/README @@ -0,0 +1,209 @@ +Setting up everything for gramps webapp grampsweb: + +This example will allow you to create a Django Database, populate it +through a GRAMPS export plugin, and then access/edit the data via the +web. + +There are two ways to run this example: using a SQL engine via a +webserver, or using a local SQL database. With either way, you'll be +able to access/edit the data over the web. The only difference is +whether GRAMPS and the webserver accesses the data locally or through +a server. + +First, the easy way with a local sqlite database (steps 2 and 3 are +the same for both): + +1/packages + +sudo yum install subversion sqlite + +2/DO STEP 2 BELOW + +3/DO STEP 3 BELOW + +4/Django settings + +Go to the branches/geps/gep-013-server/webapp/grampsweb dir and edit +settings.py to reflect your setup: + +$ cd webapp/grampsweb +$ gedit settings.py + +and make sure to set to the correct values: + +---------------------------------------------- +DATABASE_ENGINE = 'sqlite3' +# Set the DATABASE_NAME to a full name and path to database file +# This file will be created, so make sure it is in a readable/writeable place. +DATABASE_NAME = '/home/dblank/gramps/gep-013-server/webapp/grampsweb/gramps.sql' +# See file for examples for these: +TIME_ZONE: your time zone +LANGUAGE_CODE: your code +# Full path: +TEMPLATE_DIRS = ( + "/home/dblank/gramps/gep-013-server/webapp/html/templates", +) +---------------------------------------------- + +5/Make database, and then run a webserver: + +make clean +make +make run + +6/Run the Django Export plugin in this version of GRAMPS: + +(you may need to ./autogen.sh; make in top level of branch) + +python ../../src/gramps.py + +Open a family tree, and select in menu Family Tree the export +entry. Select Django export. (You used to have to give a filename; +that is fixed now.) The django installation is querried and the django +backend as given in the settings is used to write to. + +NOTE: You must manually empty the tables or delete them and regenerate +for now if you reexport your data, as the export plugin expects an +empty database. If the database is not empty, duplication errors will +occur. + +7/You can (after this plugin has finished running) go back to eg +pgadmin or the http://127.0.0.1:8000/admin to see that the objects +have been saved. You can edit them here, too. + +See the following for more details, and for setting up a more +sophisticated database server. + +---------------------------------------------- + +1/packages + +benny@antec:sudo apt-get install python-psycopg python-psycopg2 postgresql apache2 libapache2-mod-python subversion pgadmin3 pgadmin3-data + +2/get the django code.and install it + +See http://docs.djangoproject.com/en/dev/topics/install/ + + +3/get webapp sourcecode + +benny@antec:mkdir branches/geps;cd branches/geps +**** extract data here *** +svn co https://gramps.svn.sourceforge.net/svnroot/gramps/branches/geps/gep-013-server/ gep013-server + +Now go to the gramps code, and set it up + +cd gep013-server +./autogen.sh +make + +4/set up PostgreSQL +Reset the password for the 'postgres' admin account for the server + +benny@antec:cd ~ +benny@antec:sudo su postgres -c psql template1 +template1=# ALTER USER postgres WITH PASSWORD 'password'; +template1=# \q + +Add a new user into postgresql: + +benny@antec:sudo su postgres -c createuser gramps +Enter name of role to add: gramps +Shall the new role be a superuser? (y/n) y + +Now define the access rules for the database. The easiest is to give access to all databases via md5: + +benny@antec:sudo kate /etc/postgresql/8.3/main/pg_hba.conf + +and end of file should look like: +# "local" is for Unix domain socket connections only +local all all md5 +# IPv4 local connections: +host all all 127.0.0.1/32 md5 +# IPv6 local connections: +host all all ::1/128 md5 + +Restart the server: + +benny@antec:~$ sudo /etc/init.d/postgresql-8.3 restart + +5/Use pgAdmin3 to access the database server. + +benny@antec:pgadmin3 + +In the new server registration dialog, give a name for your server, and set: +Host: localhost +Maintenance DB: postgres +Username: postgres +Password: 'password' ==> the password entered above in 4/ + +Do not store the password! Next click to connect (Menu Tools->Connect). + +If all is well, postgresql is set up and you see your server running. The login roles should contain the user ´gramps` you created in 4/ + +First step is to make a database which gramps webapp can use, so right click on your server, and add a database: +name: db_gramps +owner: gramps +encoding: UTF-8 + +Next, go to the role 'gramps' and assign a password with which the user can +access. + +That's it, the tables will be created with django. + + +6/Django settings + +Go to the webapp code and change your settings to reflect your setup. + +benny@antec:cd webapp/grampsweb +benny@antec:kate settings.py + +and make sure to set to the correct values: + +DATABASE_USER: as given in 4/, standard is gramps +DATABASE_PASSWORD: the password for the user in the database grampsonrails will create +TIME_ZONE: your time zone +LANGUAGE_CODE: your code +TEMPLATE_DIRS = ( + "/yourfullpath/gep-013-server/webapp/html/templates", +) +.... + +See the Django site for more info when changing variables: +http://docs.djangoproject.com/en/dev/topics/settings/#topics-settings + +7/run your webserver + +For production, you should use Apache. For testing locally, you can use the django webserver, which is available via the manage.py file in the webapp directory. +Note that we need GRAMPS libraries, so we give the GRAMPS path for inclusion in PYTHONPATH. For effective distribution, we will ship the required libraries of GRAMPS in the application grampsweb. For my case this is + +benny@antec: PYTHONPATH=~/programs/gramps/branches/geps/gep013-server/src/ python manage.py runserver & + +Try it in your webbrowser by going to: + +http://127.0.0.1:8000/admin + +8/Create tables and start the django application + +benny@antec: python manage.py syncdb + +Create the superuser for django at this moment if needed. + +9/To see the SQL to create the tables, do: + +PYTHONPATH=~/programs/gramps/branches/geps/gep013-server/src/ python manage.py sqlall grampsdb + + +10/Now that a beginning of the tables is present, we need to pump data into it. For now, we assume all tables are empty, and we add new data to it. If the tables are not empty, drop them first, eg via pgAdmin for postgresql. +A new export plugin that can write to your django backend is written, ExportDjango. If your database exists, then you can just open a family tree, and select to export this to the django backend. At the moment only markertype and part of the person object are exported as a proof of concept. + +11/You can after this plugin is finished go back to eg pgadmin or the http://127.0.0.1:8000/admin to see the objects have been saved. + +References: +[1] http://ianlawrence.info/random-stuff/set-up-django-apache-and-postgresql-on-ubuntu-feisty/ +[2] http://www.postgresql.org/docs/8.1/static/app-createuser.html +[3] http://antoniocangiano.com/2007/12/26/installing-django-with-postgresql-on-ubuntu/ +[4] http://www.mail-archive.com/django-users@googlegroups.com/msg36675.html + + diff --git a/src/gen/web/__init__.py b/src/gen/web/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/gen/web/djangodb.py b/src/gen/web/djangodb.py new file mode 100644 index 000000000..7083851ef --- /dev/null +++ b/src/gen/web/djangodb.py @@ -0,0 +1,249 @@ +import gen +from gen.db import GrampsDbBase +from gen.web.libdjango import DjangoInterface +import Utils + +# class Trans(object): +# def __init__(self, dji_model): +# self.dji_model = dji_model + +# def get(self, handle): +# return self.dji_model.filter(handle=handle) == 1 + +# def keys(self): +# return [item.handle for item in self.dji_model.all()] + +# from ReportBase._CommandLineReport import run_report_direct +# import djangodb +# db = djangodb.DjangoDb() +# run_report_direct(db, "ancestor_report", off="pdf", of="ar.pdf") +# + +def probably_alive(handle): + db = DjangoDb() + return Utils.probably_alive(db.get_person_from_handle(handle), db) + +class Cursor(object): + def __init__(self, model, func): + self.model = model + self.func = func + def __enter__(self): + return self + def __iter__(self): + return self.__next__() + def __next__(self): + for item in self.model.all(): + yield (item.handle, self.func(item)) + def __exit__(self, *args, **kwargs): + pass + +class DjangoDb(GrampsDbBase): + """ + A Gramps Database Backend. This replicates the grampsdb functions. + """ + + def __init__(self): + super(DjangoDb, self).__init__() + self.dji = DjangoInterface() + self.readonly = False + self.db_is_open = True + + def get_event_from_handle(self, handle): + obj = gen.lib.Event() + obj.unserialize(self.dji.get_event(self.dji.Event.get(handle=handle))) + return obj + + def get_family_from_handle(self, handle): + obj = gen.lib.Family() + obj.unserialize(self.dji.get_family(self.dji.Family.get(handle=handle))) + return obj + + def get_person_from_handle(self, handle): + obj = gen.lib.Person() + data = self.dji.get_person(self.dji.Person.get(handle=handle)) + obj.unserialize(data) + return obj + + def get_person_from_gramps_id(self, gramps_id): + obj = gen.lib.Person() + data = self.dji.get_person(self.dji.Person.get(gramps_id=gramps_id)) + obj.unserialize(data) + return obj + + def get_number_of_people(self): + return self.dji.Person.count() + + def get_number_of_families(self): + return self.dji.Family.count() + + def get_number_of_notes(self): + return self.dji.Note.count() + + def get_number_of_sources(self): + return self.dji.Source.count() + + def get_number_of_media_objects(self): + return self.dji.Media.count() + + def get_number_of_repositories(self): + return self.dji.Repository.count() + + def get_place_cursor(self): + return Cursor(self.dji.Place, self.dji.get_place) + + def get_person_cursor(self): + return Cursor(self.dji.Person, self.dji.get_person) + + def has_person_handle(self, handle): + return self.dji.Person.filter(handle=handle).count() == 1 + + def has_family_handle(self, handle): + return self.dji.Family.filter(handle=handle).count() == 1 + + def has_source_handle(self, handle): + return self.dji.Source.filter(handle=handle).count() == 1 + + def has_repository_handle(self, handle): + return self.dji.Repository.filter(handle=handle).count() == 1 + + def has_note_handle(self, handle): + return self.dji.Note.filter(handle=handle).count() == 1 + + def has_place_handle(self, handle): + return self.dji.Place.filter(handle=handle).count() == 1 + + def get_raw_person_data(self, handle): + return self.dji.get_person(self.dji.Person.get(handle=handle)) + + def get_raw_family_data(self, handle): + return self.dji.get_family(self.dji.Family.get(handle=handle)) + + def get_raw_source_data(self, handle): + return self.dji.get_source(self.dji.Source.get(handle=handle)) + + def get_raw_repository_data(self, handle): + return self.dji.get_repository(self.dji.Repository.get(handle=handle)) + + def get_raw_note_data(self, handle): + return self.dji.get_note(self.dji.Note.get(handle=handle)) + + def get_raw_place_data(self, handle): + return self.dji.get_place(self.dji.Place.get(handle=handle)) + + def add_person(self, person, trans, set_gid=True): + pass + # if self.step == 0: + # if not person.handle: + # person.handle = Utils.create_id() + # if not person.gramps_id: + # person.gramps_id = self.find_next_person_gramps_id() + # self.lookup[person.gramps_id] = person.handle + # if self.dji.Person.filter(handle=person.handle).count() == 0: + # print "add_person:", person.handle + # self.dji.add_person(person.serialize()) + # else: + # print "update_person:", person.handle + # person.handle = self.lookup[person.gramps_id] + # self.dji.add_person_detail(person.serialize()) + + def add_family(self, family, trans, set_gid=True): + pass + # if self.step == 0: + # if not family.handle: + # family.handle = Utils.create_id() + # if not family.gramps_id: + # family.gramps_id = self.find_next_family_gramps_id() + # self.lookup[family.gramps_id] = family.handle + # if self.dji.Family.filter(handle=family.handle).count() == 0: + # print "add_family:", family.handle + # self.dji.add_family(family.serialize()) + # else: + # family.handle = self.lookup[family.gramps_id] + # self.dji.add_family_detail(family.serialize()) + + def add_source(self, source, trans, set_gid=True): + pass + #print "add_source:", source.handle + #if not source.handle: + # source.handle = Utils.create_id() + # self.dji.add_source(source.serialize()) + #self.dji.add_source_detail(source.serialize()) + + def add_repository(self, repository, trans, set_gid=True): + pass + #print "add_repository:", repository.handle + #if not repository.handle: + # repository.handle = Utils.create_id() + # self.dji.add_repository(repository.serialize()) + #self.dji.add_repository_detail(repository.serialize()) + + def add_note(self, note, trans, set_gid=True): + pass + #print "add_note:", note.handle + #if not note.handle: + # note.handle = Utils.create_id() + # self.dji.add_note(note.serialize()) + #self.dji.add_note_detail(note.serialize()) + + def add_place(self, place, trans, set_gid=True): + #print "add_place:", place.handle + pass + + def add_event(self, event, trans, set_gid=True): + pass + #print "add_event:", event.handle + #if not event.handle: + # event.handle = Utils.create_id() + # self.dji.add_event(event.serialize()) + #self.dji.add_event_detail(event.serialize()) + + def commit_person(self, person, trans, change_time=None): + pass + #print "commit_person:", person.handle + #self.add_person(person, trans) + + def commit_family(self, family, trans, change_time=None): + pass + #print "commit_family:", family.handle + #self.add_family(family, trans) + + def commit_source(self, source, trans, change_time=None): + pass + #print "commit_source:", source.handle + #self.add_source(source, change_time) + + def commit_repository(self, repository, trans, change_time=None): + pass + #print "commit_repository:", repository.handle + #self.add_repository(repository, change_time) + + def commit_note(self, note, trans, change_time=None): + pass + #print "commit_note:", note.handle + #self.add_note(note, change_time) + + def commit_place(self, place, trans, change_time=None): + pass + #print "commit_place:", place.handle + #if self.dji.Place.filter(handle=place.handle).count() == 0: + # self.dji.add_place(place.serialize()) + #self.dji.add_place_detail(place.serialize()) + + def commit_event(self, event, change_time=None): + pass + #print "commit_event:", event.handle + #self.add_event(event, change_time) + + # def find_family_from_handle(self, handle, trans): + # obj = gen.lib.Family() + # results = self.dji.Family.filter(handle=handle) + # if results.count() == 0: + # obj.handle = handle + # new = True + # else: + # data = self.dji.get_family(results[0]) + # obj.unserialize(data) + # new = False + # return obj, new + + diff --git a/src/gen/web/forms.py b/src/gen/web/forms.py new file mode 100644 index 000000000..eff4b60de --- /dev/null +++ b/src/gen/web/forms.py @@ -0,0 +1,69 @@ +# forms.py forms for Django project gen.web + +from django import forms +from gen.web.grampsdb.models import * +from django.forms.models import inlineformset_factory +from django.forms.models import BaseModelFormSet +import datetime + +class PersonForm(forms.ModelForm): + class Meta: + model = Person + exclude = ('handle',) + '''def clean(self): + cleaned_data['last_changed'] = datetime.datetime.now() + super(PersonForm, self).clean() # validate based on model + return self.cleaned_data''' + +class NameForm(forms.ModelForm): + class Meta: + model = Name + +'''class NameFormset(BaseModelFormSet): + def __init__(self, *args, **kwargs): + self.form = NameForm + super(NameFormset, self).__init__(*args, **kwargs) + +def makeNameFormset(pid): + class NameFormset(BaseFormSet): + def __init__(self, *args, **kwargs): + self.form = NameForm + self.queryset = Name.objects.filter(person=pid) + super(NameFormset, self).__init__(*args, **kwargs) + def clean(self): + super(NameFormset, self).clean() # validate based on model + if any(self.errors): + # formset is not valid as long as any one form is invalid + return + # allow only one name per person to be preferred + ctPref = 0 + for i in range(0, self.total_form_count()): + form = self.forms[i] + ctPref += form.cleaned_data['preferred'] + if ctPref > 1: + raise forms.ValidationError, "Only one name may be the preferred name." + return NameFormset''' + +NameInlineFormSet = inlineformset_factory(Person, Name, + fields=('preferred','prefix','first_name', + 'surname','suffix','name_type'), + form=NameForm) + +def cleanPreferred(fmst): + if fmst.total_form_count() == 3: # person has no names (assumes default 3 extra forms) + return "Error: Each person must have at least one name." + ctPref = 0 + for i in range (0,fmst.total_form_count()-3): + form = fmst.forms[i] + try: # when preferred is false, its value is not in the form data + if form.data[fmst.prefix + '-' + str(i) + '-preferred'] == 'on': + val = 1 + else: + val = 0 + except: + val = 0 + ctPref += val + if ctPref != 1: + return "Error: Exactly one name may be the preferred name." + else: + return "none" diff --git a/src/gen/web/grampsdb/__init__.py b/src/gen/web/grampsdb/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/gen/web/grampsdb/admin.py b/src/gen/web/grampsdb/admin.py new file mode 100644 index 000000000..aa4e3a8b2 --- /dev/null +++ b/src/gen/web/grampsdb/admin.py @@ -0,0 +1,6 @@ +from gen.web.grampsdb.models import * +from django.contrib import admin + +for type_name in get_tables("all"): + admin.site.register(type_name[1]) + diff --git a/src/gen/web/grampsdb/models.py b/src/gen/web/grampsdb/models.py new file mode 100644 index 000000000..80943f6ab --- /dev/null +++ b/src/gen/web/grampsdb/models.py @@ -0,0 +1,873 @@ +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2009 B. Malengier +# Copyright (C) 2009 Douglas S. Blank +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# $Id$ +# + +""" +All of the models for the grampsdb Django data schema. +This requires initial data for all of the Types, which +is loaded by the fixtures/initial_data.json, which is +created by init.py. +""" + +_DEBUG = True + +from django.db import models +from django.contrib.contenttypes.models import ContentType +from django.contrib.contenttypes import generic + +from gen.lib.date import Date as GDate, Today +from Utils import create_id, create_uid + +#--------------------------------------------------------------------------- +# +# Support functions +# +#--------------------------------------------------------------------------- + +def get_type(the_type, data, get_or_create=False): + """ + Gets the default row for a given Type and data. Data is + a pair, (VAL, NAME). VAL + NAME should be unique. Will create + one if it doesn't already exist. + """ + if type(data) == type(1): + return the_type.objects.get(val=data) + elif data[0] == the_type._CUSTOM or get_or_create: + (obj, new) = the_type.objects.get_or_create(val=data[0], + name=data[1]) + if new and _DEBUG: + print "DEBUG: Made new type:", the_type, data + return obj + else: + return the_type.objects.get(val=data[0]) + +def get_default_type(the_type): + """ + Gets the default row for a given Type. + """ + val, name = the_type._DEFAULT + return the_type.objects.get(val=val, name=name) + +def get_datamap(grampsclass): + return [(x[0],x[2]) for x in grampsclass._DATAMAP] + +#--------------------------------------------------------------------------- +# +# Types +# +#--------------------------------------------------------------------------- + +class mGrampsType(models.Model): + """ + The abstract base class for all types. + Types are enumerated integers. One integer corresponds with custom, then + custom_type holds the type name + """ + class Meta: abstract = True + + _CUSTOM = 0 + _DEFAULT = 0 + _DATAMAP = [] + + name = models.CharField(max_length=40) + + def __unicode__(self): return self.name + + def get_default_type(self): + """ return a tuple default (val,name) """ + return self._DATAMAP[self._DEFAULT] + + def __len__(self): + """ For use as a sequence for getting (val, name) """ + return 2 + + def __getitem__(self, pos): + """ for getting the parts as if they were the original tuples.""" + if pos == 0: + return self.val + elif pos == 1: + return self.name + else: + raise IndexError("type index is out of range (use 0 or 1)") + +class MarkerType(mGrampsType): + from gen.lib.markertype import MarkerType + _DATAMAP = get_datamap(MarkerType) + _CUSTOM = MarkerType._CUSTOM + _DEFAULT = _DATAMAP[MarkerType._DEFAULT] + val = models.IntegerField('marker', choices=_DATAMAP, blank=False) + +class NameType(mGrampsType): + from gen.lib.nametype import NameType + _DATAMAP = get_datamap(NameType) + _CUSTOM = NameType._CUSTOM + _DEFAULT = _DATAMAP[NameType._DEFAULT] + val = models.IntegerField('name type', choices=_DATAMAP, blank=False) + +class AttributeType(mGrampsType): + from gen.lib.attrtype import AttributeType + _DATAMAP = get_datamap(AttributeType) + _CUSTOM = AttributeType._CUSTOM + _DEFAULT = _DATAMAP[AttributeType._DEFAULT] + val = models.IntegerField('attribute type', choices=_DATAMAP, blank=False) + +class UrlType(mGrampsType): + from gen.lib.urltype import UrlType + _DATAMAP = get_datamap(UrlType) + _CUSTOM = UrlType._CUSTOM + _DEFAULT = _DATAMAP[UrlType._DEFAULT] + val = models.IntegerField('url type', choices=_DATAMAP, blank=False) + +class ChildRefType(mGrampsType): + from gen.lib.childreftype import ChildRefType + _DATAMAP = get_datamap(ChildRefType) + _CUSTOM = ChildRefType._CUSTOM + _DEFAULT = _DATAMAP[ChildRefType._DEFAULT] + val = models.IntegerField('child reference type', choices=_DATAMAP, + blank=False) + +class RepositoryType(mGrampsType): + from gen.lib.repotype import RepositoryType + _DATAMAP = get_datamap(RepositoryType) + _CUSTOM = RepositoryType._CUSTOM + _DEFAULT = _DATAMAP[RepositoryType._DEFAULT] + val = models.IntegerField('repository type', choices=_DATAMAP, blank=False) + +class EventType(mGrampsType): + from gen.lib.eventtype import EventType + _DATAMAP = get_datamap(EventType) + _CUSTOM = EventType._CUSTOM + _DEFAULT = _DATAMAP[EventType._DEFAULT] + BIRTH = 12 + DEATH = 13 + val = models.IntegerField('event type', choices=_DATAMAP, blank=False) + +class FamilyRelType(mGrampsType): + from gen.lib.familyreltype import FamilyRelType + _DATAMAP = get_datamap(FamilyRelType) + _CUSTOM = FamilyRelType._CUSTOM + _DEFAULT = _DATAMAP[FamilyRelType._DEFAULT] + val = models.IntegerField('family relation type', choices=_DATAMAP, + blank=False) + +class SourceMediaType(mGrampsType): + from gen.lib.srcmediatype import SourceMediaType + _DATAMAP = get_datamap(SourceMediaType) + _CUSTOM = SourceMediaType._CUSTOM + _DEFAULT = _DATAMAP[SourceMediaType._DEFAULT] + val = models.IntegerField('source medium type', choices=_DATAMAP, + blank=False) + +class EventRoleType(mGrampsType): + from gen.lib.eventroletype import EventRoleType + _DATAMAP = get_datamap(EventRoleType) + _CUSTOM = EventRoleType._CUSTOM + _DEFAULT = _DATAMAP[EventRoleType._DEFAULT] + val = models.IntegerField('event role type', choices=_DATAMAP, blank=False) + +class NoteType(mGrampsType): + from gen.lib.notetype import NoteType + _DATAMAP = get_datamap(NoteType) + _CUSTOM = NoteType._CUSTOM + _DEFAULT = _DATAMAP[NoteType._DEFAULT] + val = models.IntegerField('note type', choices=_DATAMAP, blank=False) + +class MarkupType(mGrampsType): + from gen.lib.notetype import NoteType + _DATAMAP = [(0, "Custom")] + _CUSTOM = 0 + _DEFAULT = _DATAMAP[0] + val = models.IntegerField('note type', choices=_DATAMAP, blank=False) + +class GenderType(mGrampsType): + _DATAMAP = [(2, 'Unknown'), (1, 'Male'), (0, 'Female')] + _DEFAULT = _DATAMAP[0] + val = models.IntegerField('gender type', choices=_DATAMAP, blank=False) + +class LdsType(mGrampsType): + _DATAMAP = [(0, "Baptism" ), + (1, "Endowment" ), + (2, "Seal to Parents"), + (3, "Seal to Spouse"), + (4, "Confirmation")] + _DEFAULT = _DATAMAP[0] + val = models.IntegerField('lds type', choices=_DATAMAP, blank=False) + +class LdsStatus(mGrampsType): + _DATAMAP = [(0, "None"), + (1, "BIC"), + (2, "Canceled"), + (3, "Child"), + (4, "Cleared"), + (5, "Completed"), + (6, "Dns"), + (7, "Infant"), + (8, "Pre 1970"), + (9, "Qualified"), + (10, "DNSCAN"), + (11, "Stillborn"), + (12, "Submitted"), + (13, "Uncleared")] + _DEFAULT = _DATAMAP[0] + val = models.IntegerField('lds status', choices=_DATAMAP, blank=False) + +#--------------------------------------------------------------------------- +# +# Support definitions +# +#--------------------------------------------------------------------------- + +class DateObject(models.Model): + class Meta: abstract = True + + calendar = models.IntegerField() + modifier = models.IntegerField() + quality = models.IntegerField() + day1 = models.IntegerField() + month1 = models.IntegerField() + year1 = models.IntegerField() + slash1 = models.BooleanField() + day2 = models.IntegerField(blank=True, null=True) + month2 = models.IntegerField(blank=True, null=True) + year2 = models.IntegerField(blank=True, null=True) + slash2 = models.NullBooleanField(blank=True, null=True) + text = models.CharField(max_length=80, blank=True) + sortval = models.IntegerField() + newyear = models.IntegerField() + + def set_date_from_datetime(self, date_time, text=""): + """ + Sets Date fields from an object that has year, month, and day + properties. + """ + y, m, d = date_time.year, date_time.month, date_time.day + self.set_ymd(self, y, m, d, text=text) + + def set_date_from_ymd(self, y, m, d, text=""): + """ + Sets Date fields from a year, month, and day. + """ + gdate = GDate(y, m, d) + gdate.text = text + self.set_date_from_gdate(gdate) + + def set_date_from_gdate(self, gdate): + """ + Sets Date fields from a Gramps date object. + """ + (self.calendar, self.modifier, self.quality, dateval, self.text, + self.sortval, self.newyear) = gdate.serialize() + if dateval is None: + (self.day1, self.month1, self.year1, self.slash1) = 0, 0, 0, False + (self.day2, self.month2, self.year2, self.slash2) = 0, 0, 0, False + elif len(dateval) == 8: + (self.day1, self.month1, self.year1, self.slash1, + self.day2, self.month2, self.year2, self.slash2) = dateval + elif len(dateval) == 4: + (self.day1, self.month1, self.year1, self.slash1) = dateval + (self.day2, self.month2, self.year2, self.slash2) = 0, 0, 0, False + +#--------------------------------------------------------------------------- +# +# Primary Tables +# +#--------------------------------------------------------------------------- + +class Config(models.Model): + """ + All of the meta config items for the entire system. + """ + setting = models.CharField('config setting', max_length=25) + description = models.TextField('description') + value_type = models.CharField('type of value', max_length=25) + value = models.TextField('value') + +class PrimaryObject(models.Model): + """ + Common attribute of all primary objects with key on the handle + """ + class Meta: abstract = True + + ## Fields: + id = models.AutoField(primary_key=True) + handle = models.CharField(max_length=19, unique=True) + gramps_id = models.CharField('gramps id', max_length=25, blank=True) + last_saved = models.DateTimeField('last changed', auto_now=True) + last_changed = models.DateTimeField('last changed', null=True, + blank=True) # user edits + private = models.BooleanField('private') + #attributes = models.ManyToManyField("Attribute", blank=True, null=True) + + ## Keys: + marker_type = models.ForeignKey('MarkerType') + + def __unicode__(self): return "%s: %s" % (self.__class__.__name__, + self.gramps_id) + +class Person(PrimaryObject): + """ + The model for the person object + """ + gender_type = models.ForeignKey('GenderType') + families = models.ManyToManyField('Family', blank=True, null=True) + parent_families = models.ManyToManyField('Family', + related_name="parent_families", + blank=True, null=True) + #addresses = models.ManyToManyField('Address', null=True, blank=True) + references = generic.GenericRelation('PersonRef', related_name="refs", + content_type_field="object_type", + object_id_field="object_id") + #lds_list = models.ManyToManyField('Lds', null=True, blank=True) + #url_list = models.ManyToManyField('Url', null=True, blank=True) + + # Others keys here: + # .name_set + # .address_set + # .lds_set + # .url_set + +class Family(PrimaryObject): + father = models.ForeignKey('Person', related_name="father_ref", + null=True, blank=True) + mother = models.ForeignKey('Person', related_name="mother_ref", + null=True, blank=True) + family_rel_type = models.ForeignKey('FamilyRelType') + #lds_list = models.ManyToManyField('Lds', null=True, blank=True) + + # Others keys here: + # .lds_set + +class Source(PrimaryObject): + title = models.CharField(max_length=50, blank=True) + author = models.CharField(max_length=50, blank=True) + pubinfo = models.CharField(max_length=50, blank=True) + abbrev = models.CharField(max_length=50, blank=True) + #datamaps = models.ManyToManyField('Datamap', null=True, blank=True) + references = generic.GenericRelation('SourceRef', related_name="refs", + content_type_field="object_type", + object_id_field="object_id") + # Other keys here: + # .datamap_set + +class Event(DateObject, PrimaryObject): + event_type = models.ForeignKey('EventType') + description = models.CharField('description', max_length=50, blank=True) + place = models.ForeignKey('Place', null=True) + references = generic.GenericRelation('EventRef', related_name="refs", + content_type_field="object_type", + object_id_field="object_id") + +class Repository(PrimaryObject): + repository_type = models.ForeignKey('RepositoryType') + name = models.TextField(blank=True) + #addresses = models.ManyToManyField('Address', null=True, blank=True) + references = generic.GenericRelation('RepositoryRef', related_name="refs", + content_type_field="object_type", + object_id_field="object_id") + #url_list = models.ManyToManyField('Url', null=True, blank=True) + + # Others keys here: + # .address_set + # .url_set + +class Place(PrimaryObject): + title = models.TextField(blank=True) + #locations = models.ManyToManyField('Location', null=True, blank=True) + long = models.TextField(blank=True) + lat = models.TextField(blank=True) + #url_list = models.ManyToManyField('Url', null=True, blank=True) + + # Others keys here: + # .url_set + # .location_set + +class Media(DateObject, PrimaryObject): + path = models.TextField(blank=True) + mime = models.TextField(blank=True, null=True) + desc = models.TextField(blank=True) + references = generic.GenericRelation('MediaRef', related_name="refs", + content_type_field="object_type", + object_id_field="object_id") + +class Note(PrimaryObject): + note_type = models.ForeignKey('NoteType') + text = models.TextField(blank=True) + preformatted = models.BooleanField('preformatted') + references = generic.GenericRelation('NoteRef', related_name="refs", + content_type_field="object_type", + object_id_field="object_id") + +#--------------------------------------------------------------------------- +# +# Secondary Tables +# +#--------------------------------------------------------------------------- + +class SecondaryObject(models.Model): + """ + We use interlinked objects, secondary object is the table for primary + objects to refer to when linking to non primary objects + """ + class Meta: abstract = True + + private = models.BooleanField() + last_saved = models.DateTimeField('last changed', auto_now=True) + last_changed = models.DateTimeField('last changed', null=True, + blank=True) # user edits + order = models.PositiveIntegerField() + +class Name(DateObject, SecondaryObject): + name_type = models.ForeignKey('NameType', related_name="name_code") + preferred = models.BooleanField('preferred name?') + first_name = models.TextField(blank=True) + surname = models.TextField(blank=True) + suffix = models.TextField(blank=True) + title = models.TextField(blank=True) + prefix = models.TextField(blank=True) + patronymic = models.TextField(blank=True) + call = models.TextField(blank=True) + group_as = models.TextField(blank=True) + sort_as = models.IntegerField(blank=True) + display_as = models.IntegerField(blank=True) + + ## Key: + person = models.ForeignKey("Person") + + def __unicode__(self): + return "%s%s%s, %s" % (self.prefix, + ["", " "][bool(self.prefix)], + self.surname, + self.first_name) + +class Lds(DateObject, SecondaryObject): + """ + BAPTISM = 0 + ENDOWMENT = 1 + SEAL_TO_PARENTS = 2 + SEAL_TO_SPOUSE = 3 + CONFIRMATION = 4 + + DEFAULT_TYPE = BAPTISM + + + STATUS_NONE = 0 + STATUS_BIC = 1 + STATUS_CANCELED = 2 + STATUS_CHILD = 3 + STATUS_CLEARED = 4 + STATUS_COMPLETED = 5 + STATUS_DNS = 6 + STATUS_INFANT = 7 + STATUS_PRE_1970 = 8 + STATUS_QUALIFIED = 9 + STATUS_DNS_CAN = 10 + STATUS_STILLBORN = 11 + STATUS_SUBMITTED = 12 + STATUS_UNCLEARED = 13 + + DEFAULT_STATUS = STATUS_NONE + """ + lds_type = models.ForeignKey('LdsType') + place = models.ForeignKey('Place', null=True) + famc = models.ForeignKey('Family', related_name="famc", null=True) + temple = models.TextField(blank=True) + status = models.ForeignKey('LdsStatus') + + person = models.ForeignKey("Person", null=True, blank=True) + family = models.ForeignKey("Family", null=True, blank=True) + +class Markup(models.Model): + note = models.ForeignKey('Note') + markup_type = models.ForeignKey('MarkupType') + order = models.PositiveIntegerField() + string = models.TextField(blank=True, null=True) + start_stop_list = models.TextField(default="[]") + +class Datamap(models.Model): + key = models.CharField(max_length=80, blank=True) + value = models.CharField(max_length=80, blank=True) + + source = models.ForeignKey("Source", null=True, blank=True) + +class Address(DateObject, SecondaryObject): + #locations = models.ManyToManyField('Location', null=True) + person = models.ForeignKey('Person', null=True, blank=True) + repository = models.ForeignKey('Repository', null=True, blank=True) + + # Others keys here: + # .location_set + + +class Location(models.Model): + street = models.TextField(blank=True) + city = models.TextField(blank=True) + county = models.TextField(blank=True) + state = models.TextField(blank=True) + country = models.TextField(blank=True) + postal = models.TextField(blank=True) + phone = models.TextField(blank=True) + parish = models.TextField(blank=True, null=True) + order = models.PositiveIntegerField() + + place = models.ForeignKey("Place", null=True, blank=True) + address = models.ForeignKey("Address", null=True, blank=True) + +class Url(models.Model): + private = models.BooleanField('private url?') + path = models.TextField(blank=True, null=True) + desc = models.TextField(blank=True, null=True) + url_type = models.ForeignKey('UrlType') + order = models.PositiveIntegerField() + + person = models.ForeignKey("Person", null=True, blank=True) + place = models.ForeignKey("Place", null=True, blank=True) + repository = models.ForeignKey("Repository", null=True, blank=True) + +class Attribute(models.Model): + private = models.BooleanField('private attribute?') + attribute_type = models.ForeignKey('AttributeType') + value = models.TextField(blank=True, null=True) + + object_type = models.ForeignKey(ContentType) + object_id = models.PositiveIntegerField() + attribute_of = generic.GenericForeignKey("object_type", "object_id") + +## consider using: +## URLField + +#--------------------------------------------------------------------------- +# +# Reference Objects +# +#--------------------------------------------------------------------------- + +class BaseRef(models.Model): + class Meta: abstract = True + + object_type = models.ForeignKey(ContentType) + object_id = models.PositiveIntegerField() + referenced_by = generic.GenericForeignKey("object_type", "object_id") + + order = models.PositiveIntegerField() + last_saved = models.DateTimeField('last changed', auto_now=True) + last_changed = models.DateTimeField('last changed', null=True) # user edits + #attributes = models.ManyToManyField("Attribute", null=True) + private = models.BooleanField() + +class NoteRef(BaseRef): + ref_object = models.ForeignKey('Note') + + def __unicode__(self): + return "NoteRef to " + str(self.ref_object) + +class SourceRef(DateObject, BaseRef): + ref_object = models.ForeignKey('Source') + page = models.CharField(max_length=50) + confidence = models.IntegerField() + + def __unicode__(self): + return "SourceRef to " + str(self.ref_object) + +class EventRef(BaseRef): + ref_object = models.ForeignKey('Event') + role_type = models.ForeignKey('EventRoleType') + + def __unicode__(self): + return "EventRef to " + str(self.ref_object) + +class RepositoryRef(BaseRef): + ref_object = models.ForeignKey('Repository') + source_media_type = models.ForeignKey('SourceMediaType') + call_number = models.CharField(max_length=50) + + def __unicode__(self): + return "RepositoryRef to " + str(self.ref_object) + +class PersonRef(BaseRef): + ref_object = models.ForeignKey('Person') + description = models.CharField(max_length=50) + + def __unicode__(self): + return "PersonRef to " + str(self.ref_object) + +class ChildRef(BaseRef): + father_rel_type = models.ForeignKey('ChildRefType', + related_name="child_father_rel") + mother_rel_type = models.ForeignKey('ChildRefType', + related_name="child_mother_rel") + ref_object = models.ForeignKey('Person') + + def __unicode__(self): + return "ChildRef to " + str(self.ref_object) + +class MediaRef(BaseRef): + x1 = models.IntegerField() + y1 = models.IntegerField() + x2 = models.IntegerField() + y2 = models.IntegerField() + ref_object = models.ForeignKey('Media') + + def __unicode__(self): + return "MediaRef to " + str(self.ref_object) + +TABLES = [ + ("abstract", mGrampsType), + ("type", MarkerType), + ("type", MarkupType), + ("type", NameType), + ("type", AttributeType), + ("type", UrlType), + ("type", ChildRefType), + ("type", RepositoryType), + ("type", EventType), + ("type", FamilyRelType), + ("type", SourceMediaType), + ("type", EventRoleType), + ("type", NoteType), + ("type", GenderType), + ("type", LdsType), + ("type", LdsStatus), + ("abstract", DateObject), + ("meta", Config), + ("abstract", PrimaryObject), + ("primary", Person), + ("primary", Family), + ("primary", Source), + ("primary", Event), + ("primary", Repository), + ("primary", Place), + ("primary", Media), + ("primary", Note), + ("abstract", SecondaryObject), + ("secondary", Attribute), + ("secondary", Datamap), + ("secondary", Name), + ("secondary", Lds), + ("secondary", Markup), + ("secondary", Address), + ("secondary", Location), + ("secondary", Url), + ("abstract", BaseRef), + ("ref", NoteRef), + ("ref", SourceRef), + ("ref", EventRef), + ("ref", RepositoryRef), + ("ref", PersonRef), + ("ref", ChildRef), + ("ref", MediaRef) + ] + +def clear_tables(*categories): + """ + Clear the entries of categories of tables. Category is: + "abstract", "type", "ref", "meta", "primary" and "secondary". + """ + for pair in get_tables(*categories): + pair[1].objects.all().delete() + +def table_stats(*categories): + """ + Shows the record counts for each table category. + """ + tables = get_tables(*categories) + tables.sort() + for pair in tables: + print ("%-25s" % pair[1].__name__), ":", \ + pair[1].objects.all().count() + +def get_tables(*categories): + return [pair for pair in TABLES if (pair[0] in categories) or + ("all" in categories) and pair[0] != "abstract"] + +#--------------------------------------------------------------------------- +# +# Testing Functions +# +#--------------------------------------------------------------------------- + +## Primary: + +def test_Person(): + m = get_default_type(MarkerType) + p = Person(handle=create_id(), marker_type=m) + p.gender_type = GenderType.objects.get(id=1) + p.gramps_id = "P%05d" % (Person.objects.count() + 1) + p.save() + return p + +def test_Family(): + m = get_default_type(MarkerType) + frt = FamilyRelType.objects.get(id=1) + f = Family(handle=create_id(), marker_type=m, family_rel_type=frt) + f.gramps_id = "F%05d" % (Family.objects.count() + 1) + f.save() + return f + +def test_Source(): + m = get_default_type(MarkerType) + s = Source(handle=create_id(), marker_type=m) + s.save() + s.gramps_id = "S%05d" % (Source.objects.count() + 1) + s.save() + return s + +def test_Event(): + m = get_default_type(MarkerType) + et = get_default_type(EventType) + e = Event(handle=create_id(), marker_type=m, event_type=et) + e.set_date_from_gdate( GDate() ) + e.gramps_id = "E%05d" % (Event.objects.count() + 1) + e.save() + return e + +def test_Repository(): + m = get_default_type(MarkerType) + rt = get_default_type(RepositoryType) + r = Repository(handle=create_id(), marker_type=m, repository_type=rt) + r.gramps_id = "R%05d" % (Repository.objects.count() + 1) + r.save() + return r + +def test_Place(): + m = get_default_type(MarkerType) + p = Place(handle=create_id(), marker_type=m) + p.gramps_id = "L%05d" % (Place.objects.count() + 1) + p.save() + return p + +def test_Media(): + m = get_default_type(MarkerType) + media = Media(handle=create_id(), marker_type=m) + media.set_date_from_gdate( GDate() ) + media.save() + media.gramps_id = "M%05d" % (Media.objects.count() + 1) + return media + +def test_Note(): + m = get_default_type(MarkerType) + note_type = get_default_type(NoteType) + note = Note(handle=create_id(), marker_type=m, note_type=note_type, + preformatted=False) + note.gramps_id = "N%05d" % (Note.objects.count() + 1) + note.save() + return note + +def test_Family_with_children(): + father = test_Person() + fname = test_Name(father, "Blank", "Lowell") + mother = test_Person() + mname = test_Name(mother, "Bamford", "Norma") + family_rel_type = get_default_type(FamilyRelType) + m = get_default_type(MarkerType) + f = Family(handle=create_id(), father=father, mother=mother, + family_rel_type=family_rel_type, marker_type=m) + f.save() + for names in [("Blank", "Doug"), ("Blank", "Laura"), ("Blank", "David")]: + p = test_Person() + n = test_Name(p, names[0], names[1]) + p.families.add(f) + f.save() + return f + +## Secondary: + +def test_Name(person=None, surname=None, first=None): + if not person: # Testing + person = test_Person() + m = get_default_type(MarkerType) + n = Name() + if first: + n.first_name = first + if surname: + n.surname = surname + n.set_date_from_gdate(Today()) + n.name_type = get_default_type(NameType) + n.order = 1 + n.sort_as = 1 + n.display_as = 1 + person.save() + n.person = person + n.save() + return n + +def test_Markup(note=None): + if not note: + note = test_Note() + markup = Markup(note=note, + markup_type=get_type(MarkupType, + (1, "Testing"), + get_or_create=True)) + markup.order = 1 + markup.save() + return markup + +def test_Lds(place=None, famc=None): + if not place: + place = test_Place() + if not famc: + famc = test_Family() + lds = Lds(lds_type=get_default_type(LdsType), status=get_default_type(LdsStatus), + place=place, famc=famc, order=1) + lds.set_date_from_gdate(Today()) + lds.save() + return lds + +def test_NoteRef(): + note = test_Note() + person = test_Person() + note_ref = NoteRef(referenced_by=person, ref_object=note) + note_ref.order = 1 + note_ref.save() + family = test_Family() + note_ref = NoteRef(referenced_by=family, ref_object=note) + note_ref.order = 1 + note_ref.save() + return note_ref + +def test_SourceRef(): + note = test_Note() + source = test_Source() + source_ref = SourceRef(referenced_by=note, ref_object=source, confidence=4) + source_ref.set_date_from_gdate(Today()) + source_ref.order = 1 + source_ref.save() + return source_ref + +#--------------------------------------------------------------------------- +# +# Testing +# +#--------------------------------------------------------------------------- + +def main(): + for test_Item in [test_Person, test_Family, test_Family_with_children, + test_Source, test_Event, + test_Repository, test_Place, test_Media, test_Note, + test_Name, test_Markup, test_Lds, test_NoteRef, + test_SourceRef]: + print "testing:", test_Item.__name__ + obj = test_Item() + + sourceref = test_SourceRef() + print sourceref.ref_object.references.all() + +if __name__ == "__main__": + main() diff --git a/src/gen/web/grampsdb/templatetags/__init__.py b/src/gen/web/grampsdb/templatetags/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/gen/web/grampsdb/templatetags/my_tags.py b/src/gen/web/grampsdb/templatetags/my_tags.py new file mode 100644 index 000000000..bfe0aa408 --- /dev/null +++ b/src/gen/web/grampsdb/templatetags/my_tags.py @@ -0,0 +1,148 @@ +from django.template import escape, Library +from gen.web import libdjango +from gen.web import djangodb +import gen.web.grampsdb.models as models +from gen.lib.date import Date as GDate, Today +import DateHandler + +dji = libdjango.DjangoInterface() +register = Library() + +_dd = DateHandler.displayer.display +_dp = DateHandler.parser.parse + +## FIXME: these dji function wrappers just use the functions +## written for the import/export. Can be done much more directly. + +def person_get_birth_date(person): + return person_get_event(person, models.EventType.BIRTH) +def person_get_death_date(person): + return person_get_event(person, models.EventType.DEATH) + +person_get_birth_date.is_safe = True +register.filter('person_get_birth_date', person_get_birth_date) +person_get_death_date.is_safe = True +register.filter('person_get_death_date', person_get_death_date) + +def display_date(obj): + date_tuple = dji.get_date(obj) + if date_tuple: + gdate = GDate() + gdate.unserialize(date_tuple) + return _dd(gdate) + else: + return "" + +def person_get_event(person, event_type): + event_ref_list = dji.get_event_ref_list(person) + index = libdjango.lookup_role_index(event_type, event_ref_list) + if index >= 0: + event_handle = event_ref_list[index][3] + # (False, [], [], u'b2cfa6cdec87392cf3b', (1, u'Primary')) + # WARNING: the same object can be referred to more than once + objs = models.EventRef.objects.filter(ref_object__handle=event_handle) + if objs.count() > 0: + return display_date(objs[0].ref_object) + else: + return "" + else: + return "" + +def make_name(name, user): + if isinstance(name, models.Name): + surname = name.surname.strip() + if not surname: + surname = "[Missing]" + if user.is_authenticated(): + return escape("%s, %s" % (surname, name.first_name)) + else: + if djangodb.probably_alive(name.person.handle): + return escape("%s, %s" % (surname, "[Living]")) + else: + return escape("%s, %s" % (surname, name.first_name)) + elif name: + name = name.get(preferred=True) + if name: + return make_name(name, user) + else: + return "" + else: + return "" +make_name.is_safe = True +register.filter('make_name', make_name) + +def missing(data): + if data.strip() == "": + return "[Missing]" + return escape(data) +missing.is_safe = True +register.filter('missing', missing) + +def currentSection(view1, view2): + if view1.strip().lower() == view2.strip().lower(): + return "CurrentSection" + return "OtherSection" +currentSection.is_safe = True +register.filter('currentSection', currentSection) + +def row_count(row, page): + return row + (page.number - 1) * page.paginator.per_page + +register.filter('row_count', row_count) + +def table_header(context, headers = None): + # add things for the header here + if headers: + context["headers"] = headers + return context + +register.inclusion_tag('table_header.html', + takes_context=True)(table_header) + +def view_navigation(context): + # add things for the view here + return context + +register.inclusion_tag('view_navigation.html', + takes_context=True)(view_navigation) + +def paginator(context, adjacent_pages=2): + """ + To be used in conjunction with the object_list generic view. + + Adds pagination context variables for use in displaying first, adjacent and + last page links in addition to those created by the object_list generic + view. + + """ +## Alternative page_numbers: + page_numbers = range(max(0, context['page']-adjacent_pages), + min(context['pages'], + context['page']+adjacent_pages)+1) + results_this_page = context['object_list'].__len__() + range_base = ((context['page'] - 1) * context['results_per_page']) + +# # Original +# # page_numbers = [n for n in range(context['page'] - adjacent_pages, +# # context['page'] + adjacent_pages + 1) +# # if n > 0 and n <= context['pages']] + + return { + 'hits': context['hits'], + 'results_per_page': context['results_per_page'], + 'results_this_page': results_this_page, + 'first_this_page': range_base + 1, + 'last_this_page': range_base + results_this_page, + 'page': context['page'], + 'pages': context['pages'], + 'page_numbers': page_numbers, + 'next': context['next'], + 'previous': context['previous'], + 'has_next': context['has_next'], + 'has_previous': context['has_previous'], + 'show_first': 1 not in page_numbers, + 'show_last': context['pages'] not in page_numbers, + } + +register.inclusion_tag('paginator.html', + takes_context=True)(paginator) diff --git a/src/gen/web/grampsdb/views.py b/src/gen/web/grampsdb/views.py new file mode 100644 index 000000000..8c362bf09 --- /dev/null +++ b/src/gen/web/grampsdb/views.py @@ -0,0 +1,125 @@ +# Create your views here. + +from django.contrib.auth import logout +from django.contrib.auth.models import User +from django.core.paginator import Paginator, InvalidPage, EmptyPage +from django.http import Http404, HttpResponseRedirect +from django.shortcuts import get_object_or_404, render_to_response +from django.template import Context, RequestContext, escape +from django.db.models import Q + +import gen +from gen.web.grampsdb.models import * +from gen.web.settings import VIEWS + +def get_views(): + ''' + VIEWS is [("People", "person"), (plural, singular), ...] + ''' + return VIEWS + +def main_page(request): + context = RequestContext(request) + context["views"] = [(pair[0], pair[1], + getattr(gen.web.grampsdb.models, pair[2]).objects.count()) + for pair in get_views()] + context["view"] = 'home' + context["cview"] = 'Home' + return render_to_response("main_page.html", context) + +def logout_page(request): + logout(request) + return HttpResponseRedirect('/') + +def user_page(request, username): + try: + user = User.objects.get(username=username) + except User.DoesNotExist: + raise Http404('Requested user not found.') + context = RequestContext(request) + context["username"] = username + context["views"] = get_views() + context["view"] = 'user' + context["cview"] = 'User' + return render_to_response('user_page.html', context) + +def view_detail(request, view, handle): + cview = view.title() + context = RequestContext(request) + context["views"] = get_views() + context["cview"] = cview + context["view"] = view + context["handle"] = handle + return render_to_response('view_detail_page.html', context) + +def view(request, view): + cview = view.title() + search = "" + view_template = 'view_page.html' + if view == "event": + object_list = Event.objects.all().order_by("gramps_id") + elif view == "family": + object_list = Family.objects.all().order_by("gramps_id") + view_template = 'view_family.html' + elif view == "media": + object_list = Media.objects.all().order_by("gramps_id") + elif view == "note": + object_list = Note.objects.all().order_by("gramps_id") + elif view == "person": + if request.GET.has_key("search"): + search = request.GET.get("search") + if request.user.is_authenticated(): + if "," in search: + surname, first_name = [term.strip() for term in search.split(",", 1)] + object_list = Name.objects. \ + select_related().filter(surname__icontains=surname, + first_name__icontains=first_name).order_by("surname", "first_name") + else: + object_list = Name.objects. \ + select_related().filter(Q(surname__icontains=search) | + Q(first_name__icontains=search) | + Q(suffix__icontains=search) | + Q(prefix__icontains=search) | + Q(patronymic__icontains=search) | + Q(title__icontains=search) | + Q(person__gramps_id__icontains=search) + ).order_by("surname", "first_name") + else: + # FIXME: non-authenticated users don't get to search first_names + if "," in search: + search, first_name = [term.strip() for term in search.split(",", 1)] + object_list = Name.objects. \ + select_related().filter(surname__icontains=search).order_by("surname", "first_name") + else: + object_list = Name.objects.select_related().order_by("surname", "first_name") + view_template = 'view_person.html' + elif view == "place": + object_list = Place.objects.all().order_by("gramps_id") + elif view == "repository": + object_list = Repository.objects.all().order_by("gramps_id") + elif view == "source": + object_list = Source.objects.all().order_by("gramps_id") + + paginator = Paginator(object_list, 20) + + try: + page = int(request.GET.get('page', '1')) + except ValueError: + page = 1 + + try: + page = paginator.page(page) + except (EmptyPage, InvalidPage): + page = paginator.page(paginator.num_pages) + + context = RequestContext(request) + context["page"] = page + context["views"] = get_views() + context["view"] = view + context["cview"] = cview + context["search"] = search + if search: + context["search_query"] = ("&search=%s" % escape(search)) + else: + context["search_query"] = "" + return render_to_response(view_template, context) diff --git a/src/gen/web/init.py b/src/gen/web/init.py new file mode 100644 index 000000000..b40dbd734 --- /dev/null +++ b/src/gen/web/init.py @@ -0,0 +1,92 @@ +""" +Creates a JSON representation of data for Django's fixture +architecture. We could have done this in Python, or SQL, +but this makes it useful for all Django-based backends +but still puts it into their syncdb API. +""" + +import time +import os +os.environ["DJANGO_SETTINGS_MODULE"] = "settings" +import settings + +from gen.lib.markertype import MarkerType +from gen.lib.nametype import NameType +from gen.lib.attrtype import AttributeType +from gen.lib.urltype import UrlType +from gen.lib.childreftype import ChildRefType +from gen.lib.repotype import RepositoryType +from gen.lib.eventtype import EventType +from gen.lib.familyreltype import FamilyRelType +from gen.lib.srcmediatype import SourceMediaType +from gen.lib.eventroletype import EventRoleType +from gen.lib.notetype import NoteType + +from grampsdb.models import GenderType, LdsType, LdsStatus + +def get_datamap(x): + """ + Returns (code, Name) for a Gramps type tuple. + """ + return (x[0],x[2]) + +print "[" +for table, entries in [("grampsdb.config", + [(("setting", "\"db_version\""), + ("description", "\"database scheme version\""), + ("value_type", "\"str\""), + ("value", "\"0.5.0\"")), + (("setting", "\"db_created\""), + ("description", "\"database creation date/time\""), + ("value_type", "\"str\""), + ("value", ('"%s"' % time.strftime("%Y-%m-%d %H:%M")))), + ])]: + entry_count = 0 + for entry in entries: + print " {" + print " \"model\": \"%s\"," % table + print " \"pk\": %d," % (entry_count + 1) + print " \"fields\":" + print " {" + key_count = 0 + for items in entry: + key, value = items + print (" \"%s\" : %s" % (key, value)), + key_count += 1 + if key_count < len(entry): + print "," + else: + print + print " }" + print " }," + entry_count += 1 + +## Add the data for the type models: + +type_models = [MarkerType, NameType, AttributeType, UrlType, ChildRefType, + RepositoryType, EventType, FamilyRelType, SourceMediaType, + EventRoleType, NoteType, GenderType, LdsType, LdsStatus] +for type in type_models: + count = 1 + # Add each code: + for tuple in type._DATAMAP: + if len(tuple) == 3: # GRAMPS BSDDB style + val, name = get_datamap(tuple) + else: # NEW SQL based + val, name = tuple + print " {" + print " \"model\": \"grampsdb.%s\"," % type.__name__.lower() + print " \"pk\": %d," % count + print " \"fields\":" + print " {" + print " \"val\" : %d," % val + print " \"name\": \"%s\"" % name + print " }" + print " }", + # if it is the last one of the last one, no comma + if type == type_models[-1] and count == len(type._DATAMAP): + print + else: + print "," + count += 1 +print "]" diff --git a/src/gen/web/init_gramps.py b/src/gen/web/init_gramps.py new file mode 100644 index 000000000..d98fa6936 --- /dev/null +++ b/src/gen/web/init_gramps.py @@ -0,0 +1,11 @@ +""" +Clears gramps data +""" + +import os +os.environ["DJANGO_SETTINGS_MODULE"] = "settings" +import settings + +import grampsdb.models as dj + +dj.clear_tables("primary", "secondary") diff --git a/src/gen/web/libdjango.py b/src/gen/web/libdjango.py new file mode 100644 index 000000000..6cd2ad0ff --- /dev/null +++ b/src/gen/web/libdjango.py @@ -0,0 +1,1230 @@ +import time + +import gen.web.grampsdb.models as models +from django.contrib.contenttypes.models import ContentType +import gen + +# To get a django person from a django database: +# djperson = dji.Person.get(handle='djhgsdh324hjg234hj24') +# +# To turn the djperson into a Gramps Person: +# tuple = dji.get_person(djperson) +# gperson = lib.gen.Person(tuple) +# OR +# gperson = djangodb.DjangoDb().get_person_from_handle(handle) + +#------------------------------------------------------------------------- +# +# Import functions +# +#------------------------------------------------------------------------- +def lookup_role_index(role0, event_ref_list): + """ + Find the handle in a unserialized event_ref_list and return code. + """ + if role0 is None: + return -1 + else: + count = 0 + for event_ref in event_ref_list: + (private, note_list, attribute_list, ref, erole) = event_ref + event = models.Event.objects.get(handle=ref) + if event.event_type[0] == role0: + return count + count += 1 + return -1 + +def totime(dtime): + return int(time.mktime(dtime.timetuple())) + +#------------------------------------------------------------------------- +# +# Export functions +# +#------------------------------------------------------------------------- +def todate(t): + return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(t)) + +def lookup(index, event_ref_list): + """ + Get the unserialized event_ref in an list of them and return it. + """ + if index < 0: + return None + else: + count = 0 + for event_ref in event_ref_list: + (private, note_list, attribute_list, ref, role) = event_ref + if index == count: + return ref + count += 1 + return None + +def get_datamap(grampsclass): + return [x[0] for x in grampsclass._DATAMAP if x[0] != grampsclass.CUSTOM] + +#------------------------------------------------------------------------- +# +# Django Interface +# +#------------------------------------------------------------------------- +class DjangoInterface(object): + """ + DjangoInterface for interoperating between Gramps and Django. + + This interface comes in a number of parts: + get_ITEMS() + add_ITEMS() + + get_ITEM(ITEM) + + Given an ITEM from a Django table, construct a Gramps Raw Data tuple. + + add_ITEM(data) + + Given a Gramps Raw Data tuple, add the data to the Django tables. + + + """ + def __init__(self): + self.debug = 0 + + def __getattr__(self, name): + """ + Django Objects database interface. + + >>> self.Person.all() + >>> self.Person.get(id=1) + >>> self.Person.get(handle='gh71234dhf3746347734') + """ + if hasattr(models, name): + return getattr(models, name).objects + else: + raise AttributeError("no such model: '%s'" % name) + + def get_model(self, name): + if hasattr(models, name): + return getattr(models, name) + else: + raise AttributeError("no such model: '%s'" % name) + + # ----------------------------------------------- + # Get methods to retrieve list data from the tables + # ----------------------------------------------- + + def clear_tables(self, *args): + return models.clear_tables(*args) + + def get_attribute_list(self, obj): + obj_type = ContentType.objects.get_for_model(obj) + attribute_list = models.Attribute.objects.filter(object_id=obj.id, + object_type=obj_type) + return [self.pack_attribute(attribute) for attribute + in attribute_list] + + def get_names(self, person, preferred): + names = person.name_set.filter(preferred=preferred).order_by("order") + if preferred: + if len(names) > 0: + return self.pack_name(names[0]) + else: + return gen.lib.Name().serialize() + else: + return [self.pack_name(name) for name in names] + + def get_datamap(self, obj): # obj is source + datamap_dict = {} + datamap_list = obj.datamap_set.all() + for datamap in datamap_list: + datamap_dict[datamap.key] = datamap.value + return datamap_dict + + def get_media_list(self, obj): + obj_type = ContentType.objects.get_for_model(obj) + mediarefs = models.MediaRef.objects.filter(object_id=obj.id, + object_type=obj_type) + retval = [] + for mediaref in mediarefs: + retval.append(self.pack_media_ref(mediaref)) + return retval + + def get_note_list(self, obj): + obj_type = ContentType.objects.get_for_model(obj) + noterefs = models.NoteRef.objects.filter(object_id=obj.id, + object_type=obj_type) + retval = [] + for noteref in noterefs: + retval.append( noteref.ref_object.handle) + return retval + + def get_repository_ref_list(self, obj): + obj_type = ContentType.objects.get_for_model(obj) + reporefs = models.RepositoryRef.objects.filter(object_id=obj.id, + object_type=obj_type) + return [self.pack_repository_ref(repo) for repo in reporefs] + + def get_url_list(self, obj): + return [self.pack_url(url) for url in obj.url_set.all().order_by("order")] + + def get_address_list(self, obj, with_parish): # person or repository + addresses = obj.address_set.all().order_by("order") + retval = [] + count = 1 + for address in addresses: + retval.append(self.pack_address(address, with_parish)) + count += 1 + return retval + + def get_child_ref_list(self, family): + obj_type = ContentType.objects.get_for_model(family) + childrefs = models.ChildRef.objects.filter(object_id=family.id, \ + object_type=obj_type).order_by("order") + retval = [] + for childref in childrefs: + retval.append(self.pack_child_ref(childref)) + return retval + + def get_source_ref_list(self, obj): + obj_type = ContentType.objects.get_for_model(obj) + sourcerefs = models.SourceRef.objects.filter(object_id=obj.id, \ + object_type=obj_type).order_by("order") + retval = [] + for sourceref in sourcerefs: + retval.append(self.pack_source_ref(sourceref)) + return retval + + def get_event_refs(self, obj, order="order"): + obj_type = ContentType.objects.get_for_model(obj) + eventrefs = models.EventRef.objects.filter(object_id=obj.id, \ + object_type=obj_type).order_by(order) + return eventrefs + + def get_event_ref_list(self, obj): + obj_type = ContentType.objects.get_for_model(obj) + eventrefs = models.EventRef.objects.filter(object_id=obj.id, \ + object_type=obj_type).order_by("order") + retval = [] + for eventref in eventrefs: + retval.append(self.pack_event_ref(eventref)) + return retval + + def get_family_list(self, person): # person has families + return [fam.handle for fam in person.families.all()] + + def get_parent_family_list(self, person): + return [fam.handle for fam in person.parent_families.all()] + + def get_person_ref_list(self, person): + obj_type = ContentType.objects.get_for_model(person) + return [self.pack_person_ref(x) for x in + models.PersonRef.objects.filter(object_id=person.id, + object_type=obj_type)] + + def get_lds_list(self, obj): # person or family + return [self.pack_lds(lds) for lds in obj.lds_set.all().order_by("order")] + + def get_place_handle(self, obj): # obj is event + if obj.place: + return obj.place.handle + return '' + + ## Packers: + + def get_event(self, event): + handle = event.handle + gid = event.gramps_id + the_type = tuple(event.event_type) + description = event.description + change = totime(event.last_changed) + marker = tuple(event.marker_type) + private = event.private + note_list = self.get_note_list(event) + source_list = self.get_source_ref_list(event) + media_list = self.get_media_list(event) + attribute_list = self.get_attribute_list(event) + date = self.get_date(event) + place = self.get_place_handle(event) + return (str(handle), gid, the_type, date, description, place, + source_list, note_list, media_list, attribute_list, + change, marker, private) + + def get_note(self, note): + styled_text = [note.text, []] + markups = models.Markup.objects.filter(note=note).order_by("order") + for markup in markups: + value = markup.string + start_stop_list = markup.start_stop_list + ss_list = eval(start_stop_list) + styled_text[1] += [(tuple(markup.markup_type), + value, ss_list)] + changed = totime(note.last_changed) + return (str(note.handle), + note.gramps_id, + styled_text, + note.preformatted, + tuple(note.note_type), + changed, + tuple(note.marker_type), + note.private) + + def get_family(self, family): + child_ref_list = self.get_child_ref_list(family) + event_ref_list = self.get_event_ref_list(family) + media_list = self.get_media_list(family) + attribute_list = self.get_attribute_list(family) + lds_seal_list = self.get_lds_list(family) + source_list = self.get_source_ref_list(family) + note_list = self.get_note_list(family) + if family.father: + father_handle = family.father.handle + else: + father_handle = '' + if family.mother: + mother_handle = family.mother.handle + else: + mother_handle = '' + return (str(family.handle), family.gramps_id, + father_handle, mother_handle, + child_ref_list, tuple(family.family_rel_type), + event_ref_list, media_list, + attribute_list, lds_seal_list, + source_list, note_list, + totime(family.last_changed), + tuple(family.marker_type), + family.private) + + def get_repository(self, repository): + note_list = self.get_note_list(repository) + address_list = self.get_address_list(repository, with_parish=False) + url_list = self.get_url_list(repository) + return (str(repository.handle), + repository.gramps_id, + tuple(repository.repository_type), + repository.name, + note_list, + address_list, + url_list, + totime(repository.last_changed), + tuple(repository.marker_type), + repository.private) + + def get_source(self, source): + note_list = self.get_note_list(source) + media_list = self.get_media_list(source) + datamap = self.get_datamap(source) + reporef_list = self.get_repository_ref_list(source) + return (str(source.handle), + source.gramps_id, + source.title, + source.author, + source.pubinfo, + note_list, + media_list, + source.abbrev, + totime(source.last_changed), + datamap, + reporef_list, + tuple(source.marker_type), + source.private) + + def get_media(self, media): + attribute_list = self.get_attribute_list(media) + source_list = self.get_source_ref_list(media) + note_list = self.get_note_list(media) + date = self.get_date(media) + return (str(media.handle), + media.gramps_id, + media.path, + media.mime, + media.desc, + attribute_list, + source_list, + note_list, + totime(media.last_changed), + date, + tuple(media.marker_type), + media.private) + + def get_person(self, person): + primary_name = self.get_names(person, True) # one + alternate_names = self.get_names(person, False) # list + event_ref_list = self.get_event_ref_list(person) + family_list = self.get_family_list(person) + parent_family_list = self.get_parent_family_list(person) + media_list = self.get_media_list(person) + address_list = self.get_address_list(person, with_parish=False) + attribute_list = self.get_attribute_list(person) + url_list = self.get_url_list(person) + lds_ord_list = self.get_lds_list(person) + psource_list = self.get_source_ref_list(person) + pnote_list = self.get_note_list(person) + person_ref_list = self.get_person_ref_list(person) + # This looks up the events for the first EventType given: + death_ref_index = lookup_role_index(models.EventType.DEATH, event_ref_list) + birth_ref_index = lookup_role_index(models.EventType.BIRTH, event_ref_list) + return (str(person.handle), + person.gramps_id, + tuple(person.gender_type)[0], + primary_name, + alternate_names, + death_ref_index, + birth_ref_index, + event_ref_list, + family_list, + parent_family_list, + media_list, + address_list, + attribute_list, + url_list, + lds_ord_list, + psource_list, + pnote_list, + totime(person.last_changed), + tuple(person.marker_type), + person.private, + person_ref_list) + + def get_date(self, obj): + if ((obj.calendar == obj.modifier == obj.quality == obj.sortval == obj.newyear == 0) and + obj.text == "" and (not obj.slash1) and (not obj.slash2) and + (obj.day1 == obj.month1 == obj.year1 == 0) and + (obj.day2 == obj.month2 == obj.year2 == 0)): + return None + elif ((not obj.slash1) and (not obj.slash2) and + (obj.day2 == obj.month2 == obj.year2 == 0)): + dateval = (obj.day1, obj.month1, obj.year1, obj.slash1) + else: + dateval = (obj.day1, obj.month1, obj.year1, obj.slash1, + obj.day2, obj.month2, obj.year2, obj.slash2) + return (obj.calendar, obj.modifier, obj.quality, dateval, + obj.text, obj.sortval, obj.newyear) + + def get_place(self, place): + locations = place.location_set.all().order_by("order") + main_loc = None + alt_location_list = [] + for location in locations: + if main_loc is None: + main_loc = self.pack_location(location, True) + else: + alt_location_list.append(self.pack_location(location, True)) + url_list = self.get_url_list(place) + media_list = self.get_media_list(place) + source_list = self.get_source_ref_list(place) + note_list = self.get_note_list(place) + return (str(place.handle), + place.gramps_id, + place.title, + place.long, + place.lat, + main_loc, + alt_location_list, + url_list, + media_list, + source_list, + note_list, + totime(place.last_changed), + tuple(place.marker_type), + place.private) + + # --------------------------------- + # Packers + # --------------------------------- + + ## The packers build GRAMPS raw unserialized data. + + ## Reference packers + + def pack_child_ref(self, child_ref): + source_list = self.get_source_ref_list(child_ref) + note_list = self.get_note_list(child_ref) + return (child_ref.private, source_list, note_list, child_ref.ref_object.handle, + tuple(child_ref.father_rel_type), tuple(child_ref.mother_rel_type)) + + def pack_person_ref(self, personref): + source_list = self.get_source_ref_list(personref) + note_list = self.get_note_list(personref) + return (personref.private, + source_list, + note_list, + personref.ref_object.handle, + personref.description) + + def pack_media_ref(self, media_ref): + source_list = self.get_source_ref_list(media_ref) + note_list = self.get_note_list(media_ref) + attribute_list = self.get_attribute_list(media_ref) + if ((media_ref.x1 == media_ref.y1 == media_ref.x2 == media_ref.y2 == -1) or + (media_ref.x1 == media_ref.y1 == media_ref.x2 == media_ref.y2 == 0)): + role = None + else: + role = (media_ref.x1, media_ref.y1, media_ref.x2, media_ref.y2) + return (media_ref.private, source_list, note_list, attribute_list, + media_ref.ref_object.handle, role) + + def pack_repository_ref(self, repo_ref): + note_list = self.get_note_list(repo_ref) + return (note_list, + repo_ref.ref_object.handle, + repo_ref.call_number, + tuple(repo_ref.source_media_type), + repo_ref.private) + + def pack_media_ref(self, media_ref): + note_list = self.get_note_list(media_ref) + attribute_list = self.get_attribute_list(media_ref) + source_list = self.get_source_ref_list(media_ref) + return (media_ref.private, source_list, note_list, attribute_list, + media_ref.ref_object.handle, (media_ref.x1, + media_ref.y1, + media_ref.x2, + media_ref.y2)) + + def pack_event_ref(self, event_ref): + note_list = self.get_note_list(event_ref) + attribute_list = self.get_attribute_list(event_ref) + return (event_ref.private, note_list, attribute_list, + event_ref.ref_object.handle, tuple(event_ref.role_type)) + + def pack_source_ref(self, source_ref): + ref = source_ref.ref_object.handle + confidence = source_ref.confidence + page = source_ref.page + private = source_ref.private + date = self.get_date(source_ref) + note_list = self.get_note_list(source_ref) + return (date, private, note_list, confidence, ref, page) + + def pack_address(self, address, with_parish): + source_list = self.get_source_ref_list(address) + date = self.get_date(address) + note_list = self.get_note_list(address) + locations = address.location_set.all().order_by("order") + if len(locations) > 0: + location = self.pack_location(locations[0], with_parish) + else: + if with_parish: + location = (("", "", "", "", "", "", ""), "") + else: + location = ("", "", "", "", "", "", "") + return (address.private, source_list, note_list, date, location) + + def pack_lds(self, lds): + source_list = self.get_source_ref_list(lds) + note_list = self.get_note_list(lds) + date = self.get_date(lds) + if lds.famc: + famc = lds.famc.handle + else: + famc = None + place = self.get_place_handle(lds) + return (source_list, note_list, date, lds.lds_type[0], place, + famc, lds.temple, lds.status[0], lds.private) + + def pack_source(self, source): + note_list = self.get_note_list(source) + media_list = self.get_media_list(source) + reporef_list = self.get_repository_ref_list(source) + datamap = self.get_datamap(source) + return (source.handle, source.gramps_id, source.title, + source.author, source.pubinfo, + note_list, + media_list, + source.abbrev, + totime(last_changed), datamap, + reporef_list, + tuple(source.marker_type), source.private) + + def pack_name(self, name): + source_list = self.get_source_ref_list(name) + note_list = self.get_note_list(name) + date = self.get_date(name) + return (name.private, source_list, note_list, date, + name.first_name, name.surname, name.suffix, name.title, + tuple(name.name_type), name.prefix, name.patronymic, + name.group_as, name.sort_as, name.display_as, name.call) + + def pack_location(self, loc, with_parish): + if with_parish: + return ((loc.street, loc.city, loc.county, loc.state, loc.country, + loc.postal, loc.phone), loc.parish) + else: + return (loc.street, loc.city, loc.county, loc.state, loc.country, + loc.postal, loc.phone) + + def pack_url(self, url): + return (url.private, url.path, url.desc, tuple(url.url_type)) + + def pack_attribute(self, attribute): + source_list = self.get_source_ref_list(attribute) + note_list = self.get_note_list(attribute) + return (attribute.private, + source_list, + note_list, + tuple(attribute.attribute_type), + attribute.value) + + + ## Export lists: + + def add_child_ref_list(self, obj, ref_list): + ## Currently, only Family references children + for child_data in ref_list: + self.add_child_ref(obj, child_data) + + def add_source_ref_list(self, obj, source_list): + for source_data in source_list: + self.add_source_ref(obj, source_data) + + def add_event_ref_list(self, obj, event_ref_list): + for event_ref in event_ref_list: + self.add_event_ref(obj, event_ref) + + def add_note_list(self, obj, note_list): + for handle in note_list: + # Just the handle + note = models.Note.objects.get(handle=handle) + self.add_note_ref(obj, note) + + def add_alternate_name_list(self, person, alternate_names): + for name in alternate_names: + if name: + self.add_name(person, name, False) + + def add_parent_family_list(self, person, parent_family_list): + for parent_family_data in parent_family_list: + self.add_parent_family(person, parent_family_data) + + def add_media_ref_list(self, person, media_list): + for media_data in media_list: + self.add_media_ref(person, media_data) + + def add_attribute_list(self, obj, attribute_list): + for attribute_data in attribute_list: + self.add_attribute(obj, attribute_data) + + def add_url_list(self, field, obj, url_list): + if not url_list: return None + count = 1 + for url_data in url_list: + self.add_url(field, obj, url_data, count) + count += 1 + + def add_person_ref_list(self, obj, person_ref_list): + for person_ref_data in person_ref_list: + self.add_person_ref(obj, person_ref_data) + + def add_address_list(self, field, obj, address_list): + count = 1 + for address_data in address_list: + self.add_address(field, obj, address_data, count) + count += 1 + + def add_lds_list(self, field, obj, lds_ord_list): + count = 1 + for ldsord in lds_ord_list: + lds = self.add_lds(field, obj, ldsord, count) + #obj.lds_list.add(lds) + #obj.save() + count += 1 + + def add_repository_ref_list(self, obj, reporef_list): + for data in reporef_list: + self.add_repository_ref(obj, data) + + def add_family_ref_list(self, person, family_list): + for family_handle in family_list: + self.add_family_ref(person, family_handle) + + ## Export reference objects: + + def add_person_ref(self, obj, person_ref_data): + (private, + source_list, + note_list, + handle, + desc) = person_ref_data + person = models.Person.objects.get(handle=handle) + count = person.references.count() + person_ref = models.PersonRef(referenced_by=obj, + ref_object=person, + private=private, + order=count + 1, + description=desc) + person_ref.save() + self.add_note_list(person_ref, note_list) + self.add_source_ref_list(person_ref, source_list) + + def add_note_ref(self, obj, note): + count = note.references.count() + note_ref = models.NoteRef(referenced_by=obj, + ref_object=note, + private=False, + order=count + 1) + note_ref.save() + + def add_media_ref(self, obj, media_ref_data): + (private, source_list, note_list, attribute_list, + ref, role) = media_ref_data + media = models.Media.objects.get(handle=ref) + count = media.references.count() + if not role: + role = (0,0,0,0) + media_ref = models.MediaRef(referenced_by=obj, + ref_object=media, + x1=role[0], + y1=role[1], + x2=role[2], + y2=role[3], + private=private, + order=count + 1) + media_ref.save() + self.add_note_list(media_ref, note_list) + self.add_attribute_list(media_ref, attribute_list) + self.add_source_ref_list(media_ref, source_list) + + def add_source_ref(self, obj, source_data): + (date, private, note_list, confidence, ref, page) = source_data + source = models.Source.objects.get(handle=ref) + count = source.references.count() + source_ref = models.SourceRef(private=private, + confidence=confidence, + page=page, + order=count + 1, + referenced_by=obj, + ref_object=source) + self.add_date(source_ref, date) + source_ref.save() + self.add_note_list(source_ref, note_list) + + def add_child_ref(self, obj, data): + (private, source_list, note_list, ref, frel, mrel) = data + child = models.Person.objects.get(handle=ref) + count = models.ChildRef.objects.filter(object_id=obj.id,object_type=obj).count() + child_ref = models.ChildRef(private=private, + referenced_by=obj, + ref_object=child, + order=count + 1, + father_rel_type=models.get_type(models.ChildRefType, frel), + mother_rel_type=models.get_type(models.ChildRefType, mrel)) + child_ref.save() + self.add_source_ref_list(child_ref, source_list) + self.add_note_list(child_ref, note_list) + + def add_event_ref(self, obj, event_data): + (private, note_list, attribute_list, ref, role) = event_data + event = models.Event.objects.get(handle=ref) + count = models.EventRef.objects.filter(object_id=obj.id,object_type=obj).count() + event_ref = models.EventRef(private=private, + referenced_by=obj, + ref_object=event, + order=count + 1, + role_type = models.get_type(models.EventRoleType, role)) + event_ref.save() + self.add_note_list(event_ref, note_list) + self.add_attribute_list(event_ref, attribute_list) + + def add_repository_ref(self, obj, reporef_data): + (note_list, + ref, + call_number, + source_media_type, + private) = reporef_data + repository = models.Repository.objects.get(handle=ref) + count = models.RepositoryRef.objects.filter(object_id=obj.id,object_type=obj).count() + repos_ref = models.RepositoryRef(private=private, + referenced_by=obj, + call_number=call_number, + source_media_type=models.get_type(models.SourceMediaType, + source_media_type), + ref_object=repository, + order=count + 1) + repos_ref.save() + self.add_note_list(repos_ref, note_list) + + def add_family_ref(self, obj, handle): + family = models.Family.objects.get(handle=handle) + obj.families.add(family) + obj.save() + + ## Export individual objects: + + def add_datamap_dict(self, source, datamap_dict): + for key in datamap_dict: + value = datamap_dict[key] + datamap = models.Datamap(key=key, value=value) + datamap.source = source + datamap.save() + #source.datamaps.add(datamap) + #source.save() + + def add_lds(self, field, obj, data, order): + (lsource_list, lnote_list, date, type, place_handle, + famc_handle, temple, status, private) = data + if place_handle: + place = models.Place.objects.get(handle=place_handle) + else: + place = None + if famc_handle: + famc = models.Family.objects.get(handle=famc_handle) + else: + famc = None + lds = models.Lds(lds_type = models.get_type(models.LdsType, type), + temple=temple, + place=place, + famc=famc, + order=order, + status = models.get_type(models.LdsStatus, status), + private=private) + self.add_date(lds, date) + lds.save() + self.add_note_list(lds, lnote_list) + self.add_source_ref_list(lds, lsource_list) + if field == "person": + lds.person = obj + elif field == "family": + lds.family = obj + else: + raise AttributeError("invalid field '%s' to attach lds" % + field) + lds.save() + return lds + + def add_address(self, field, obj, address_data, order): + (private, asource_list, anote_list, date, location) = address_data + address = models.Address(private=private, order=order) + self.add_date(address, date) + address.save() + self.add_location("address", address, location, 1) + self.add_note_list(address, anote_list) + self.add_source_ref_list(address, asource_list) + if field == "person": + address.person = obj + elif field == "repository": + address.repository = obj + else: + raise AttributeError("invalid field '%s' to attach address" % + field) + address.save() + #obj.save() + #obj.addresses.add(address) + #obj.save() + + def add_attribute(self, obj, attribute_data): + (private, source_list, note_list, the_type, value) = attribute_data + attribute_type = models.get_type(models.AttributeType, the_type) + attribute = models.Attribute(private=private, + attribute_of=obj, + attribute_type=attribute_type, + value=value) + attribute.save() + self.add_source_ref_list(attribute, source_list) + self.add_note_list(attribute, note_list) + #obj.attributes.add(attribute) + #obj.save() + + def add_url(self, field, obj, url_data, order): + (private, path, desc, type) = url_data + url = models.Url(private=private, + path=path, + desc=desc, + order=order, + url_type=models.get_type(models.UrlType, type)) + if field == "person": + url.person = obj + elif field == "repository": + url.repository = obj + elif field == "place": + url.place = obj + else: + raise AttributeError("invalid field '%s' to attach to url" % + field) + url.save() + #obj.url_list.add(url) + #obj.save() + + def add_place_ref(self, event, place_handle): + if place_handle: + place = models.Place.objects.get(handle=place_handle) + event.place = place + event.save() + + def add_parent_family(self, person, parent_family_handle): + # handle + family = models.Family.objects.get(handle=parent_family_handle) + person.parent_families.add(family) + person.save() + + def add_date(self, obj, date): + if date is None: + (calendar, modifier, quality, text, sortval, newyear) = \ + (0, 0, 0, "", 0, 0) + day1, month1, year1, slash1 = 0, 0, 0, 0 + day2, month2, year2, slash2 = 0, 0, 0, 0 + else: + (calendar, modifier, quality, dateval, text, sortval, newyear) = date + if len(dateval) == 4: + day1, month1, year1, slash1 = dateval + day2, month2, year2, slash2 = 0, 0, 0, 0 + elif len(dateval) == 8: + day1, month1, year1, slash1, day2, month2, year2, slash2 = dateval + else: + raise AttributeError("ERROR: dateval format '%s'" % dateval) + obj.calendar = calendar + obj.modifier = modifier + obj.quality = quality + obj.text = text + obj.sortval = sortval + obj.newyear = newyear + obj.day1 = day1 + obj.month1 = month1 + obj.year1 = year1 + obj.slash1 = slash1 + obj.day2 = day2 + obj.month2 = month2 + obj.year2 = year2 + obj.slash2 = slash2 + + def add_name(self, person, data, preferred): + if data: + (private, source_list, note_list, date, + first_name, surname, suffix, title, + name_type, prefix, patronymic, + group_as, sort_as, display_as, call) = data + + count = person.name_set.count() + name = models.Name() + name.order = count + 1 + name.preferred = preferred + name.private = private + name.first_name = first_name + name.surname = surname + name.suffix = suffix + name.title = title + name.name_type = models.get_type(models.NameType, name_type) + name.prefix = prefix + name.patronymic = patronymic + name.group_as = group_as + name.sort_as = sort_as + name.display_as = display_as + name.call = call + # we know person exists + # needs to have an ID for key + name.person = person + self.add_date(name, date) + name.save() + self.add_note_list(name, note_list) + self.add_source_ref_list(name, source_list) + #person.save() + + ## Export primary objects: + + def add_person(self, data): + # Unpack from the BSDDB: + (handle, # 0 + gid, # 1 + gender, # 2 + primary_name, # 3 + alternate_names, # 4 + death_ref_index, # 5 + birth_ref_index, # 6 + event_ref_list, # 7 + family_list, # 8 + parent_family_list, # 9 + media_list, # 10 + address_list, # 11 + attribute_list, # 12 + url_list, # 13 + lds_ord_list, # 14 + psource_list, # 15 + pnote_list, # 16 + change, # 17 + marker, # 18 + private, # 19 + person_ref_list, # 20 + ) = data + + person = models.Person(handle=handle, + gramps_id=gid, + last_changed=todate(change), + private=private, + marker_type = models.get_type(models.MarkerType, marker), + gender_type = models.get_type(models.GenderType, gender)) + person.save() + + def add_person_detail(self, data): + # Unpack from the BSDDB: + (handle, # 0 + gid, # 1 + gender, # 2 + primary_name, # 3 + alternate_names, # 4 + death_ref_index, # 5 + birth_ref_index, # 6 + event_ref_list, # 7 + family_list, # 8 + parent_family_list, # 9 + media_list, # 10 + address_list, # 11 + attribute_list, # 12 + url_list, # 13 + lds_ord_list, # 14 + psource_list, # 15 + pnote_list, # 16 + change, # 17 + marker, # 18 + private, # 19 + person_ref_list, # 20 + ) = data + + person = models.Person.objects.get(handle=handle) + if primary_name: + self.add_name(person, primary_name, True) + self.add_alternate_name_list(person, alternate_names) + self.add_event_ref_list(person, event_ref_list) + self.add_family_ref_list(person, family_list) + self.add_parent_family_list(person, parent_family_list) + self.add_media_ref_list(person, media_list) + self.add_note_list(person, pnote_list) + self.add_attribute_list(person, attribute_list) + self.add_url_list("person", person, url_list) + self.add_person_ref_list(person, person_ref_list) + self.add_source_ref_list(person, psource_list) + self.add_address_list("person", person, address_list) + self.add_lds_list("person", person, lds_ord_list) + + def add_note_detail(self, data): + """ + Dummy method for consistency with other two-pass adds. + """ + pass + + def add_note(self, data): + # Unpack from the BSDDB: + (handle, gid, styled_text, format, note_type, + change, marker, private) = data + text, markup_list = styled_text + n = models.Note(handle=handle, + gramps_id=gid, + last_changed=todate(change), + private=private, + preformatted=format, + text=text, + marker_type = models.get_type(models.MarkerType, marker), + note_type = models.get_type(models.NoteType, note_type)) + n.save() + count = 1 + for markup in markup_list: + markup_code, value, start_stop_list = markup + m = models.Markup(note=n, order=count, + markup_type=models.get_type(models.MarkupType, markup_code, get_or_create=True), + string=value, + start_stop_list=str(start_stop_list)) + m.save() + + def add_family(self, data): + # Unpack from the BSDDB: + (handle, gid, father_handle, mother_handle, + child_ref_list, the_type, event_ref_list, media_list, + attribute_list, lds_seal_list, source_list, note_list, + change, marker, private) = data + + family = models.Family(handle=handle, gramps_id=gid, + family_rel_type = models.get_type(models.FamilyRelType, the_type), + last_changed=todate(change), + marker_type = models.get_type(models.MarkerType, marker), + private=private) + family.save() + + def add_family_detail(self, data): + # Unpack from the BSDDB: + (handle, gid, father_handle, mother_handle, + child_ref_list, the_type, event_ref_list, media_list, + attribute_list, lds_seal_list, source_list, note_list, + change, marker, private) = data + + family = models.Family.objects.get(handle=handle) + # father_handle and/or mother_handle can be None + if father_handle: + family.father = models.Person.objects.get(handle=father_handle) + if mother_handle: + family.mother = models.Person.objects.get(handle=mother_handle) + family.save() + self.add_child_ref_list(family, child_ref_list) + self.add_note_list(family, note_list) + self.add_attribute_list(family, attribute_list) + self.add_source_ref_list(family, source_list) + self.add_media_ref_list(family, media_list) + self.add_event_ref_list(family, event_ref_list) + self.add_lds_list("family", family, lds_seal_list) + + def add_source(self, data): + (handle, gid, title, + author, pubinfo, + note_list, + media_list, + abbrev, + change, datamap, + reporef_list, + marker, private) = data + source = models.Source(handle=handle, gramps_id=gid, title=title, + author=author, pubinfo=pubinfo, abbrev=abbrev, + last_changed=todate(change), private=private) + source.marker_type = models.get_type(models.MarkerType, marker) + source.save() + + def add_source_detail(self, data): + (handle, gid, title, + author, pubinfo, + note_list, + media_list, + abbrev, + change, datamap, + reporef_list, + marker, private) = data + source = models.Source.objects.get(handle=handle) + self.add_note_list(source, note_list) + self.add_media_ref_list(source, media_list) + self.add_datamap_dict(source, datamap) + self.add_repository_ref_list(source, reporef_list) + + def add_repository(self, data): + (handle, gid, the_type, name, note_list, + address_list, url_list, change, marker, private) = data + + repository = models.Repository(handle=handle, + gramps_id=gid, + marker_type=models.get_type(models.MarkerType, marker), + last_changed=todate(change), + private=private, + repository_type=models.get_type(models.RepositoryType, the_type), + name=name) + repository.save() + + def add_repository_detail(self, data): + (handle, gid, the_type, name, note_list, + address_list, url_list, change, marker, private) = data + + repository = models.Repository.objects.get(handle=handle) + self.add_note_list(repository, note_list) + self.add_url_list("repository", repository, url_list) + self.add_address_list("repository", repository, address_list) + + def add_location(self, field, obj, location_data, order): + if location_data == None: return + if len(location_data) == 7: + (street, city, county, state, country, postal, phone) = location_data + parish = None + elif len(location_data) == 2: + ((street, city, county, state, country, postal, phone), parish) = location_data + else: + print "ERROR: what kind of location is this?", location_data + location = models.Location(street = street, + city = city, + county = county, + state = state, + country = country, + postal = postal, + phone = phone, + parish = parish, + order = order) + if field == "address": + location.address = obj + elif field == "place": + location.place = obj + else: + raise AttributeError("invalid field '%s' to attach to location" % + field) + location.save() + #obj.locations.add(location) + #obj.save() + + def add_place(self, data): + (handle, gid, title, long, lat, + main_loc, alt_location_list, + url_list, + media_list, + source_list, + note_list, + change, marker, private) = data + place = models.Place(handle=handle, gramps_id=gid, title=title, + long=long, lat=lat, last_changed=todate(change), + marker_type=models.get_type(models.MarkerType, marker), + private=private) + place.save() + + def add_place_detail(self, data): + (handle, gid, title, long, lat, + main_loc, alt_location_list, + url_list, + media_list, + source_list, + note_list, + change, marker, private) = data + place = models.Place.objects.get(handle=handle) + self.add_url_list("place", place, url_list) + self.add_media_ref_list(place, media_list) + self.add_source_ref_list(place, source_list) + self.add_note_list(place, note_list) + self.add_location("place", place, main_loc, 1) + count = 2 + for loc_data in alt_location_list: + self.add_location("place", place, loc_data, count) + count + 1 + + def add_media(self, data): + (handle, gid, path, mime, desc, + attribute_list, + source_list, + note_list, + change, + date, + marker, + private) = data + media = models.Media(handle=handle, gramps_id=gid, + path=path, mime=mime, + desc=desc, last_changed=todate(change), + marker_type=models.get_type(models.MarkerType, marker), + private=private) + self.add_date(media, date) + media.save() + + def add_media_detail(self, data): + (handle, gid, path, mime, desc, + attribute_list, + source_list, + note_list, + change, + date, + marker, + private) = data + media = models.Media.objects.get(handle=handle) + self.add_note_list(media, note_list) + self.add_source_ref_list(media, source_list) + self.add_attribute_list(media, attribute_list) + + def add_event(self, data): + (handle, gid, the_type, date, description, place_handle, + source_list, note_list, media_list, attribute_list, + change, marker, private) = data + event = models.Event(handle=handle, + gramps_id=gid, + event_type=models.get_type(models.EventType, the_type), + private=private, + marker_type=models.get_type(models.MarkerType, marker), + description=description, + last_changed=todate(change)) + self.add_date(event, date) + event.save() + + def add_event_detail(self, data): + (handle, gid, the_type, date, description, place_handle, + source_list, note_list, media_list, attribute_list, + change, marker, private) = data + event = models.Event.objects.get(handle=handle) + self.add_place_ref(event, place_handle) + self.add_note_list(event, note_list) + self.add_attribute_list(event, attribute_list) + self.add_media_ref_list(event, media_list) + self.add_source_ref_list(event, source_list) + diff --git a/src/gen/web/manage.py b/src/gen/web/manage.py new file mode 100755 index 000000000..5e78ea979 --- /dev/null +++ b/src/gen/web/manage.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python +from django.core.management import execute_manager +try: + import settings # Assumed to be in the same directory. +except ImportError: + import sys + sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__) + sys.exit(1) + +if __name__ == "__main__": + execute_manager(settings) diff --git a/src/gen/web/settings.py b/src/gen/web/settings.py new file mode 100644 index 000000000..f3e17b533 --- /dev/null +++ b/src/gen/web/settings.py @@ -0,0 +1,73 @@ +# Django settings for gramps project. + +DEBUG = True +TEMPLATE_DEBUG = DEBUG + +ADMINS = ( + ('admin', 'your_email@domain.com'), +) + +MANAGERS = ADMINS +DATABASE_ENGINE = 'sqlite3' +DATABASE_NAME = '/home/dblank/gramps/trunk/src/gen/web/sqlite.db' +DATABASE_USER = '' +DATABASE_PASSWORD = '' +DATABASE_HOST = '' +DATABASE_PORT = '' +TIME_ZONE = 'America/New_York' +LANGUAGE_CODE = 'en-us' +SITE_ID = 1 +USE_I18N = True +MEDIA_ROOT = '' +MEDIA_URL = '' +ADMIN_MEDIA_PREFIX = '/gramps-media/' +SECRET_KEY = 'zd@%vslj5sqhx94_8)0hsx*rk9tj3^ly$x+^*tq4bggr&uh$ac' + +TEMPLATE_LOADERS = ( + 'django.template.loaders.filesystem.load_template_source', + 'django.template.loaders.app_directories.load_template_source', +) + +MIDDLEWARE_CLASSES = ( + 'django.middleware.common.CommonMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', +) + +ROOT_URLCONF = 'gen.web.urls' + +TEMPLATE_DIRS = ( + # Use absolute paths, not relative paths. + "/home/dblank/gramps/trunk/src/data/templates", +) + +INSTALLED_APPS = ( + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.sites', + 'django.contrib.admin', + 'gen.web.grampsdb', +# 'django_extensions', +) + +# Had to add these to use settings.configure(): +DATABASE_OPTIONS = '' +URL_VALIDATOR_USER_AGENT = '' +DEFAULT_INDEX_TABLESPACE = '' +DEFAULT_TABLESPACE = '' +CACHE_BACKEND = 'locmem://' +TRANSACTIONS_MANAGED = False +LOCALE_PATHS = tuple() + +# Views: (Nice name plural, /name/handle, Model Name) +VIEWS = [('People', 'person', 'Person'), + ('Families', 'family', 'Family'), + ('Events', 'event', 'Event'), + ('Notes', 'note', 'Note'), + ('Media', 'media', 'Media'), + ('Sources', 'source', 'Source'), + ('Places', 'place', 'Place'), + ('Repositories', 'repository', 'Repository'), + ] + diff --git a/src/gen/web/sortheaders.py b/src/gen/web/sortheaders.py new file mode 100644 index 000000000..f3e645e94 --- /dev/null +++ b/src/gen/web/sortheaders.py @@ -0,0 +1,232 @@ +# Author: insin +# Site: http://www.djangosnippets.org/snippets/308/ + +from django.core.paginator import InvalidPage, EmptyPage + +from unicodedata import normalize +import locale + +ORDER_VAR = 'o' +ORDER_TYPE_VAR = 'ot' + +def first_letter(text): + """ + Text should be a unicode string. Returns first letter. + """ + if len(text) > 0: + letter = normalize('NFKC', text)[0].upper() + (lang_country, modifier ) = locale.getlocale() + if lang_country == "sv_SE" and letter in [u'W', u'V']: + letter = u'V,W' + return letter + else: + return u'?' + +class SortHeaders: + """ + Handles generation of an argument for the Django ORM's + ``order_by`` method and generation of table headers which reflect + the currently selected sort, based on defined table headers with + matching sort criteria. + + Based in part on the Django Admin application's ``ChangeList`` + functionality. + """ + def __init__(self, request, headers, default_order_field=None, + default_order_type='asc', additional_params=None): + """ + request + The request currently being processed - the current sort + order field and type are determined based on GET + parameters. + + headers + A list of two-tuples of header text and matching ordering + criteria for use with the Django ORM's ``order_by`` + method. A criterion of ``None`` indicates that a header + is not sortable. + + default_order_field + The index of the header definition to be used for default + ordering and when an invalid or non-sortable header is + specified in GET parameters. If not specified, the index + of the first sortable header will be used. + + default_order_type + The default type of ordering used - must be one of + ``'asc`` or ``'desc'``. + + additional_params: + Query parameters which should always appear in sort links, + specified as a dictionary mapping parameter names to + values. For example, this might contain the current page + number if you're sorting a paginated list of items. + """ + if default_order_field is None: + for i, (header, query_lookup) in enumerate(headers): + if query_lookup is not None: + default_order_field = i + break + if default_order_field is None: + raise AttributeError('No default_order_field was specified and none of the header definitions given were sortable.') + if default_order_type not in ('asc', 'desc'): + raise AttributeError('If given, default_order_type must be one of \'asc\' or \'desc\'.') + if additional_params is None: additional_params = {} + + self.header_defs = headers + self.additional_params = additional_params + self.order_field, self.order_type = default_order_field, default_order_type + + # Determine order field and order type for the current request + params = dict(request.GET.items()) + if ORDER_VAR in params: + try: + new_order_field = int(params[ORDER_VAR]) + if headers[new_order_field][1] is not None: + self.order_field = new_order_field + except (IndexError, ValueError): + pass # Use the default + if ORDER_TYPE_VAR in params and params[ORDER_TYPE_VAR] in ('asc', 'desc'): + self.order_type = params[ORDER_TYPE_VAR] + + def headers(self): + """ + Generates dicts containing header and sort link details for + all defined headers. + """ + for i, (header, order_criterion) in enumerate(self.header_defs): + th_classes = [] + new_order_type = 'asc' + if i == self.order_field: + th_classes.append('sorted %sending' % self.order_type) + new_order_type = {'asc': 'desc', 'desc': 'asc'}[self.order_type] + yield { + 'text': header, + 'sortable': order_criterion is not None, + 'url': self.get_query_string({ORDER_VAR: i, ORDER_TYPE_VAR: new_order_type}), + 'class_attr': (th_classes and ' class="%s"' % ' '.join(th_classes) or ''), + } + + def get_query_string(self, params): + """ + Creates a query string from the given dictionary of + parameters, including any additonal parameters which should + always be present. + """ + params.update(self.additional_params) + return '?%s' % '&'.join(['%s=%s' % (param, value) \ + for param, value in params.items()]) + + def get_order_by(self): + """ + Creates an ordering criterion based on the current order + field and order type, for use with the Django ORM's + ``order_by`` method. + """ + return '%s%s' % ( + self.order_type == 'desc' and '-' or '', + self.header_defs[self.order_field][1], + ) + +class NamePaginator(object): + """Pagination for string-based objects""" + + def __init__(self, object_list, on=None, per_page=25): + self.object_list = object_list + self.count = len(object_list) + self.pages = [] + + # chunk up the objects so we don't need to iterate over the whole list for each letter + chunks = {} + + for obj in self.object_list: + if on: + obj_str = unicode(getattr(obj, on)) + else: + obj_str = unicode(obj) + + letter = first_letter(obj_str[0]) + + if letter not in chunks: + chunks[letter] = [] + + chunks[letter].append(obj) + + # the process for assigning objects to each page + current_page = NamePage(self) + + for letter in string.ascii_uppercase: + if letter not in chunks: + current_page.add([], letter) + continue + + sub_list = chunks[letter] # the items in object_list starting with this letter + + new_page_count = len(sub_list) + current_page.count + # first, check to see if sub_list will fit or it needs to go onto a new page. + # if assigning this list will cause the page to overflow... + # and an underflow is closer to per_page than an overflow... + # and the page isn't empty (which means len(sub_list) > per_page)... + if (new_page_count > per_page and + abs(per_page - current_page.count) < abs(per_page - new_page_count) and + current_page.count > 0): + # make a new page + self.pages.append(current_page) + current_page = NamePage(self) + + current_page.add(sub_list, letter) + + # if we finished the for loop with a page that isn't empty, add it + if current_page.count > 0: self.pages.append(current_page) + + def page(self, num): + """Returns a Page object for the given 1-based page number.""" + if len(self.pages) == 0: + return None + elif num > 0 and num <= len(self.pages): + return self.pages[num-1] + else: + raise InvalidPage + + @property + def num_pages(self): + """Returns the total number of pages""" + return len(self.pages) + +class NamePage(object): + def __init__(self, paginator): + self.paginator = paginator + self.object_list = [] + self.letters = [] + + @property + def count(self): + return len(self.object_list) + + @property + def start_letter(self): + if len(self.letters) > 0: + self.letters.sort(key=locale.strxfrm) + return first_letter(self.letters) + else: return None + + @property + def end_letter(self): + if len(self.letters) > 0: + self.letters.sort(key=locale.strxfrm) + return self.letters[-1] + else: return None + + @property + def number(self): + return self.paginator.pages.index(self) + 1 + + def add(self, new_list, letter=None): + if len(new_list) > 0: self.object_list = self.object_list + new_list + if letter: self.letters.append(letter) + + def __unicode__(self): + if self.start_letter == self.end_letter: + return self.start_letter + else: + return u'%c-%c' % (self.start_letter, self.end_letter) diff --git a/src/gen/web/sqlite.db b/src/gen/web/sqlite.db new file mode 100644 index 0000000000000000000000000000000000000000..b6361907061ddd76f2d7084628081f5d709b8ca1 GIT binary patch literal 707584 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

L}4zPmgk3$rum^rdZmE%n&%}F(oL@k!jFZLG(5p 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�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 eFhmtASXS^G7ad%2;wdJ> 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 literal 0 HcmV?d00001 diff --git a/src/gen/web/urls.py b/src/gen/web/urls.py new file mode 100644 index 000000000..3864bd0ee --- /dev/null +++ b/src/gen/web/urls.py @@ -0,0 +1,38 @@ +from django.conf.urls.defaults import * + +from django.contrib import admin +admin.autodiscover() + +from gen.web.grampsdb.views import (main_page, user_page, logout_page, + view, view_detail) + +urlpatterns = patterns('', + # Specific matches first: + (r'^admin/(.*)', admin.site.root), +) + +urlpatterns += patterns('', + # Static serves! DANGEROUS in production: + (r'^styles/(?P.*)$', 'django.views.static.serve', + {'document_root': + '/home/dblank/gramps/trunk/src/data', + 'show_indexes': + True}, + ), + (r'^images/(?P.*)$', 'django.views.static.serve', + {'document_root': + '/home/dblank/gramps/trunk/src/images', + 'show_indexes': + True}, + ), +) + +# The rest will match views: +urlpatterns += patterns('', + (r'^$', main_page), + (r'^user/(\w+)/$', user_page), + (r'^login/$', 'django.contrib.auth.views.login'), + (r'^logout/$', logout_page), + (r'^(?P(\w+))/$', view), + (r'^(?P(\w+))/(?P(\w+))/$', view_detail), +)