Git Product home page Git Product logo

digipal's Introduction

DOI

Latest version: 2.8, Jan 2022. See the Change Log for more details.

Archetype

Archetype (formerly known as 'The DigiPal Framework') is freely-available generalised software for the online presentation of images with structured annotations and data which allows users to search for, view, and organise detailed characteristics of handwriting or other material in both verbal and visual form. Designed primarily for the palaeographical analysis of handwriting, it was first developed for the Digital Resource and Database for Palaeography, Manuscript Studies and Diplomatic (DigiPal) project, funded by the European Research Council, and has since been extended particularly through the Models of Authority and Exon Domesday projects. Examples of its use include the following:

The DigiPal Project formally ended on 30 September 2014, but the code is still being updated and extended as part of the follow-on projects listed above.

Contributors

For further information on using Archetype please see the GitHub Wiki pages.

The research leading to these results has received funding from the European Union Seventh Framework Programme (FP7) under grant agreement no. 263751, and the Arts and Humanities Research Council (AHRC) under Grant Reference nos. AH/L013975/1 and AH/L008041/1.

digipal's People

Contributors

gbuomprisco avatar geoffroy-noel-ddh avatar jmiguelv avatar pastokes avatar rgaldieri avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

digipal's Issues

transcription interface

Hi again! I tried to look for some documentation or tutorials for the transcription part, but was unable to find anything. Is there any links containing some explanations? I failed to unerstand it by mysel by playing with it. I am very interested in all the annotation options and in the synchronisation with the image. Thanks!

Bugs related to graph nesting and masking

Three bugs discovered on SephardiPal:

  • The nested annotations should be placed on top of the nesting ones, at the moment they are sometimes underneath and therefore non clickable.
  • If annotate a 'Frame content' (defined as nesting level = 2) within a Frame annotation (nesting level = 1), the nesting is properly detected but on the annotation tab on the front end the Frame content is visible (despite being defined as Hidden in the database) and the content of the Frame is not masked.

Managing annotations when replacing an image file

The admin interface allows editors to replace the image file an Image record points to. Doing this can invalidates the graphical location of all the existing annotations on this image.

We need to warn the user of the risk at least and possibly recommend them to upload new images into new record then using the annotation conversion tool if the two images are similar enough.

It would also be useful to develop a tool to assist with the detection of displaced annotations. This could, for instance, be based on the absence of any feature in the new image region (i.e. just a fairly uniform background color). Finding a few annotations of that kind should be enough to raise concern about the validity of the rest of the annotations on that image.

Another technique would consist in comparing pairs of images obtained from using the annotation.cutout and the annotation.geo_json. The RGN parameter in annotation.cutout is no longer used but still recorded (but probably not updated when the annotation boundaries are edited). Therefore images with a large proportion of annotations with non-matching coordinates should be flagged up for review.

Finally, it might be worth developing a tool to convert the coordinates from RGN to geo_json. This will be enough to restore annotations displaced by the upload of a new identical image where only the resolution has changed.

Language and Historial item error message in backend

"Adding a text language in a historical item when I click to save the language, I land on an error page : The page does not exist (404), language object with primary key u'add/5' does not exist. But after that the language becomes available in the list of languages."

Postgres password authentication failed during first startup in Dockerised Archetype

In a recent clean install of Dockerised Archetype, on first running after install, startup failed due to password authentication failure in the Django connection to the PostgreSQL server (see screenshot below).

It turns out that there was no app_digipal user in the database (and indeed no digipal database), and so Django couldn't connect.

The workaround was to go in and manually create the digipal database and the app user (following the details in settings.py), after which it ran fine.

I've only seen this error once in the Dockerised version (and once when I installed Archetype as a shared instance following the Docker build file). I guess there's not much we can do, but I'm noting it in case others have seen it and in case the workaround is helpful to anyone else.

erreur archetype

Meaning of Aspects and Appearance

I don't find any documentation about the meaning and usage of Aspects and Appearance under Descriptor. I would like to know if they may be useful for my case.

Get rid of 'NOCATNO' in the labels of the HI records

Create a new HI without a catalogue number and save it
=> the display label contains 'NOCATNO'

This can be propagated to the label of the itempart and pollutes the labels with nonsense everywhere on the site. We should instead leave this part of the display label blank and we could use filters on the HI to detect missing cat nums rather than using a keyword like that.

This issue is particularly disruptive to ScandiPal.

Preserve view in Collections URL

For collections, it would be ideal if the view settings could also be preserved in the URL (e.g. grid vs table, any grouping etc.). This would help sharing, particularly for larger collections.

Move documentation from doc folder to wiki

The documentation would be more accessible from GitHub if it's on the Wiki rather than buried in the doc folder. We'd need to think about how it would work, as presumably only a subset of the docs would be automatically posted on the framework websites.

Publication dates on blog pages should be exact

I've had some complaints that the 'one month ago' format of displaying dates on the blog and news pages doesn't allow for proper citation. I think it's good to keep this format on the front page, as an indicator of activity, but on the blog entry itself I agree that the exact date of publication would be better.

As discussed, it would also be better to have the comments higher up the page, perhaps immediately after the 'share' buttons and certainly after all the 'related article' links. Otherwise they tend to get lost.

custom sort for components in annotation

Hi! I would like to know if there is a way to create a custom sort for the components in the annotation interface, so that we could place the most relevant components on top and the least at the bottom. I am thinking of the possibility to add numbers to the components (01, 02, ...) to force the order we want, but I would like to know if there is a cleaner way to do this. Thanks!

'Manuscript Images' on Scribe record always shows 0

The 'Manuscript Images' tab on Scribe records seems always to show 0, even when there are images. Clicking on the tab shows the images correctly. This issue seems to be right through all released versions: it's visible on DigiPal (e.g. https://www.digipal.eu/digipal/scribes/1/), MoA (not obviously because scribes aren't normally visible, but see https://www.modelsofauthority.ac.uk/digipal/scribes/1/) and also on Archetype 2.1.1. Being logged in to admin or not seems to make no difference (on MoA no images are visible for those not logged in but they are publicly visible on DigiPal and my instance of Archetype).

Record_hands.html template throws UnicodeDecode Error for any non-ASCII character in the ItemPart label.

The record_hands.html template assumes that all characters in the ItemPart label are ASCII and so it throws a UnicodeDecodeError if not ('ascii' codec can't decode byte XXX in position YYY: ordinal not in range(128)). This is evident particularly in DigiPal as many Item Parts have en-dashes in the labels and so all associated Hand pages do not display. See, for instance, most of the hands at https://www.digipal.eu/digipal/scribes/1/hands/

I imagine the same problem exists elsewhere so we probably need to do a careful search at some point, but this is the only one I've found so far.

Add ItemPart Form

The new, quick entry form for adding new Item Part has the following issues:

  • a current item is required: in some cases a current item does not exist (for instance reconstructed manuscripts in ScandiPal)
  • when you go to a historical item and click on the + to add a new item part from there, submitting the quick form does not return to the historical form. This is a default Django feature: the popup should close on save and the new item inserted into the drop down of the calling form
  • lack of explanation on the form page about the way it works or why the submission fails
  • if you select an existing shelf mark, it would be useful to also pre-populate the repository. The case where different repo share the same shelfmark is possible but rare enough to allow this shortcut.

Add OpenAPI Compatibility

Perhaps more aspirational and not necessary, but it might be worth adding compliance with OpenAPI to improve uptake and usability of the API. It looks relatively straightforward and brings with it a lot of useful tools and an exploratory interface.

problem visualising image for annotation

Hi, we've been having problems visualising the images we uploaded for annotation. Most of the times we cannot see the image or we see only part of it. if we zoom out completely we can see the whole image in small size, but the moment we try to zoom in again, the image dissapears. I tried with different browsers (firefox, chrome, opera, windows edge), in windows, linux and android and with low and high resolution images. The problem persisted. In the end, I converted the dimention of one of our images into the one that comes as an example with the archrtype fresh installation, i.e. 1649x2000, and I could see the image fine and zoom in and out without problems. Does this mean that we are force to convert all our images to these dimentions? Cheers! Alicia.

Improve UI for blocked edits to annotations

If the API is locked to edits (as is normal on a live site) then admin users can can still edit annotations in the dialogue box but saving the edits will fail. It's correct that they can't save, but at the moment no useful feedback is given to the user explaining why. Ideally a message should be returned explaining this, and (even better) admin users should not be able to edit annotations to begin with if they can't then save the results. (Even better would presumably be that admins who are logged in can indeed edit, but I imagine that this would require significant extensions to the API).

Show ItemPart relationships on the front end

It would be very useful to indicate related ItemParts in the search results and also in the 'manuscripts view' page. What I'm imagining in the search results page is something like a 'plus' icon to indicate that there are more parts to this manuscript, and clicking on it would list those parts would then list the relevant ItemParts. In theory these additional IPs could be those connected through the CurrentItem or through the HistoricalItem, though the emphasis on the search results is through HistoricalItems so I think this alone would be enough.
Similarly (and, arguably, more importantly), in the manuscripts record view page, it seems relevant to list the other ItemParts for the corresponding HistoricalItem and perhaps CurrentItem somewhere there.

Add feature to regenerate indices from Admin interface

It might be useful to allow Admin users to regenerate the search indices from the admin interface. I guess this is resource-intensive so shouldn't be allowed lightly, but for people running the system on Docker or sim. then asking them to go to the command line is a bit off-putting, and regenerating the indices on small projects I guess isn't that heavy. Perhaps have a local_settings to decide if it's available from the admin or not?

Error when deleting a historical item

DoesNotExist at /admin/digipal/historicalitem/2/delete/
HistoricalItem matching query does not exist.

in models.py

def on_post_delete(self):
    # save the associated HI (to recalculate HI.catalogue_number and
    # HI.display_label)
                if self.historical_item: ...
        self.historical_item.save()

self = <CatalogueNumber: Gneuss 4>

Hard-coded references to DigiPal

There are a number of hard-coded references to DigiPal still in the system, some of which are visible on the live site. Some I've seen are:

  • Of course the header
  • 'DigiPal Scribe' and 'DigiPal Hand' numbering
  • In the Admin side menubar (though I'm less worried about this since it is the DigiPal framework)

There are probably others as well so we should check and deal with them.

Collections counter doesn't update if annotations are deleted

A small point that's only relevant to superusers, but for the record:

  • Add an annotation to a collection
  • Delete the annotation entirely (not just from the collection but from the database)
  • The Collection displays correctly, insofar as the remaining annotations are shown, but the count in the menu bar still shows the previous value.

Records with sort order should then still sort on 'primary' field

Some records (e.g. Ontograph) have a 'Sort Order' field which is used for sorting on the front end. This works, but if two records have the same Sort Order then it should secondarily be sorted on whatever 'primary' field is displayed. E.g. if all Ontographs have Sort Order = 0 (as they do by default) then the sorting should then be done on Name. This way we don't need to provide Sort Orders if the standard canonical sorting is sufficient.

IIP path should be same as digipal path by default

By default, the path for the IIP server should be assumed to be the same as that for the main DigiPal framework. This should then be overridden either through the admin interface or local_settings.py. This would then make the virtual machine much easier for people to use.

Give warning if annotation too small

If an annotation is too small then it's not accepted by the annotator (in order to avoid accidentally leaving small annotations everywhere). Ideally there should be a warning to the user, in case the user is trying to make small annotations and can't see why it doesn't work.

Shareable URLs for the annotations and collections are always on http.

If your site is on https only and you click the share icon for a collection, it will generate a long URL with http protocol. If you use that URL in your browser you can get an server error if your web server does not support http.

Note that the short URL is also wrong as it is just a redirect to the long version.

Problem discovered on ScandiPal.

The solution should be to generate a long URL with the same protocol of the current web page the javascript is running from.

Update Footer and About text in Dockerised Archetype content

The official Docker image of Archetype still has references to 'the DigiPal Framework' in the footer and About page, both of which should be replaced with Archetype. Suggested text is:

For the footer:

Archetype is developed by the...

For the About page:

This website is based on Archetype (formerly known as the DigiPal Framework). This is generic...

Menu bar remains visible in full screen image view

Apparently a new issue, but when looking at images in full screen view, the horizontal menu bar (home, search, My collection etc) remains visible: see attached screenshot. Seen on Safari 11 and Firefox 58, using Archetype v. 2.2.1.
archetype screenshot

Dockerised Archetype can lose data on Windows 10 Home

How to reproduce:

  • Host OS: Windows 10 Home edition

  • install Archetype according to the instructions found on the Dockerhub page

  • run it, stop, start, ...
    => working all fine

  • use Kitematic to share the volume
    => the container restarts and the startup process fails because Postgresql requires exclusive access to the database (now moved from the contained to the host machine) but Docker on Windows 10 Home only gives default permission set which are too liberal for postgresql.

Can't start Archetype

I get this and then nothing. Having installed Kitematic on macbook pro, started archetype, but then ...

STARTING CONTAINER...

  • Starting PostgreSQL 9.5 database server
    ...done.
    WARNING: local_settings.py not found
    Traceback (most recent call last):
    File "manage.py", line 11, in
    execute_from_command_line(sys.argv)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/init.py", line 354, in execute_from_command_line
    utility.execute()
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/init.py", line 346, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 394, in run_from_argv
    self.execute(*args, **cmd_options)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 445, in execute
    output = self.handle(*args, **options)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/migrate.py", line 93, in handle
    executor = MigrationExecutor(connection, self.migration_progress_callback)
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 19, in init
    self.loader = MigrationLoader(self.connection)
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/loader.py", line 47, in init
    self.build_graph()
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/loader.py", line 191, in build_graph
    self.applied_migrations = recorder.applied_migrations()
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/recorder.py", line 59, in applied_migrations
    self.ensure_schema()
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/recorder.py", line 53, in ensure_schema
    editor.create_model(self.Migration)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/schema.py", line 286, in create_model
    self.execute(sql, params or None)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/schema.py", line 111, in execute
    cursor.execute(sql, params)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
    File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 98, in exit
    six.reraise(dj_exc_type, dj_exc_value, traceback)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 62, in execute
    return self.cursor.execute(sql)
    django.db.utils.ProgrammingError: no schema has been selected to create in
    LINE 1: CREATE TABLE "django_migrations" ("id" serial NOT NULL PRIMA...
    ^
    2020-06-26T06:47:38.934393129Z
    WARNING: local_settings.py not found
    Traceback (most recent call last):
    File "manage.py", line 11, in
    execute_from_command_line(sys.argv)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/init.py", line 354, in execute_from_command_line
    utility.execute()
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/init.py", line 346, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 394, in run_from_argv
    self.execute(*args, **cmd_options)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 445, in execute
    output = self.handle(*args, **options)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/migrate.py", line 93, in handle
    executor = MigrationExecutor(connection, self.migration_progress_callback)
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 19, in init
    self.loader = MigrationLoader(self.connection)
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/loader.py", line 47, in init
    self.build_graph()
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/loader.py", line 191, in build_graph
    self.applied_migrations = recorder.applied_migrations()
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/recorder.py", line 59, in applied_migrations
    self.ensure_schema()
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/recorder.py", line 53, in ensure_schema
    editor.create_model(self.Migration)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/schema.py", line 286, in create_model
    self.execute(sql, params or None)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/schema.py", line 111, in execute
    cursor.execute(sql, params)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
    File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 98, in exit
    six.reraise(dj_exc_type, dj_exc_value, traceback)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 62, in execute
    return self.cursor.execute(sql)
    django.db.utils.ProgrammingError: no schema has been selected to create in
    LINE 1: CREATE TABLE "django_migrations" ("id" serial NOT NULL PRIMA...
    ^
    2020-06-26T06:47:39.950094365Z
    WARNING: local_settings.py not found
    Traceback (most recent call last):
    File "manage.py", line 11, in
    execute_from_command_line(sys.argv)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/init.py", line 354, in execute_from_command_line
    utility.execute()
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/init.py", line 346, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/init.py", line 190, in fetch_command
    klass = load_command_class(app_name, subcommand)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/init.py", line 40, in load_command_class
    module = import_module('%s.management.commands.%s' % (app_name, name))
    File "/usr/lib/python2.7/importlib/init.py", line 37, in import_module
    import(name)
    File "/home/digipal/digipal/management/commands/dpsearch.py", line 11, in
    from digipal.views.faceted_search.search_indexer import SearchIndexer
    File "/home/digipal/digipal/views/faceted_search/search_indexer.py", line 4, in
    from digipal.views.faceted_search import faceted_search
    File "/home/digipal/digipal/views/faceted_search/faceted_search.py", line 5, in
    from digipal.forms import SearchPageForm
    File "/home/digipal/digipal/forms.py", line 44, in
    class ImageAnnotationForm(forms.Form):
    File "/home/digipal/digipal/forms.py", line 47, in ImageAnnotationForm
    if status_list:
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 170, in nonzero
    return type(self).bool(self)
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 166, in bool
    self._fetch_all()
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 965, in _fetch_all
    self._result_cache = list(self.iterator())
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 238, in iterator
    results = compiler.execute_sql()
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 840, in execute_sql
    cursor.execute(sql, params)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
    File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 98, in exit
    six.reraise(dj_exc_type, dj_exc_value, traceback)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
    django.db.utils.ProgrammingError: relation "digipal_status" does not exist
    LINE 1: ...atus"."created", "digipal_status"."modified" FROM "digipal_s...
    ^
    2020-06-26T06:48:18.121449590Z
    WARNING: local_settings.py not found
    Traceback (most recent call last):
    File "manage.py", line 11, in
    execute_from_command_line(sys.argv)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/init.py", line 354, in execute_from_command_line
    utility.execute()
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/init.py", line 346, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/init.py", line 190, in fetch_command
    klass = load_command_class(app_name, subcommand)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/init.py", line 40, in load_command_class
    module = import_module('%s.management.commands.%s' % (app_name, name))
    File "/usr/lib/python2.7/importlib/init.py", line 37, in import_module
    import(name)
    File "/home/digipal/digipal/management/commands/dpsearch.py", line 11, in
    from digipal.views.faceted_search.search_indexer import SearchIndexer
    File "/home/digipal/digipal/views/faceted_search/search_indexer.py", line 4, in
    from digipal.views.faceted_search import faceted_search
    File "/home/digipal/digipal/views/faceted_search/faceted_search.py", line 5, in
    from digipal.forms import SearchPageForm
    File "/home/digipal/digipal/forms.py", line 44, in
    class ImageAnnotationForm(forms.Form):
    File "/home/digipal/digipal/forms.py", line 47, in ImageAnnotationForm
    if status_list:
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 170, in nonzero
    return type(self).bool(self)
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 166, in bool
    self._fetch_all()
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 965, in _fetch_all
    self._result_cache = list(self.iterator())
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 238, in iterator
    results = compiler.execute_sql()
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 840, in execute_sql
    cursor.execute(sql, params)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
    File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 98, in exit
    six.reraise(dj_exc_type, dj_exc_value, traceback)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
    django.db.utils.ProgrammingError: relation "digipal_status" does not exist
    LINE 1: ...atus"."created", "digipal_status"."modified" FROM "digipal_s...
    ^
    2020-06-26T06:48:38.874945989Z
  • Stopping PostgreSQL 9.5 database server
    ...done.
    waiting for site... (1)
    2020-06-26 06:49:00,891 CRIT Supervisor running as root (no user in config file)
    2020-06-26 06:49:00,896 INFO supervisord started with pid 146
    waiting for site... (2)
    2020-06-26 06:49:01,901 INFO spawned: 'pgsql' with pid 153
    2020-06-26 06:49:01,903 INFO spawned: 'iipsrv' with pid 154
    2020-06-26 06:49:01,906 INFO spawned: 'django' with pid 155
    2020-06-26 06:49:01,908 INFO spawned: 'nginx' with pid 156
    waiting for site... (3)
    2020-06-26 06:49:03,867 INFO success: pgsql entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
    2020-06-26 06:49:03,867 INFO success: iipsrv entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
    2020-06-26 06:49:03,868 INFO success: django entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
    2020-06-26 06:49:03,868 INFO success: nginx entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
    waiting for site... (4)
    waiting for site... (5)
    waiting for site... (6)
    waiting for site... (7)
    waiting for site... (8)
    waiting for site... (9)
    waiting for site... (10)
    waiting for site... (11)
    waiting for site... (12)
    waiting for site... (13)
    waiting for site... (14)
    waiting for site... (15)
    waiting for site... (16)
    waiting for site... (17)
    waiting for site... (18)
    waiting for site... (19)
    waiting for site... (20)
    waiting for site... (21)
    waiting for site... (22)
    waiting for site... (23)
    waiting for site... (24)
    waiting for site... (25)
    waiting for site... (26)
    waiting for site... (27)
    waiting for site... (28)
    waiting for site... (29)
    waiting for site... (30)
    waiting for site... (31)
    waiting for site... (32)
    waiting for site... (33)
    waiting for site... (34)
    waiting for site... (35)
    waiting for site... (36)
    waiting for site... (37)
    waiting for site... (38)
    waiting for site... (39)
    waiting for site... (40)
    waiting for site... (41)
    waiting for site... (42)
    waiting for site... (43)
    waiting for site... (44)
    waiting for site... (45)
    waiting for site... (46)
    waiting for site... (47)
    waiting for site... (48)
    waiting for site... (49)
    waiting for site... (50)
    waiting for site... (51)
    waiting for site... (52)
    waiting for site... (53)
    waiting for site... (54)
    waiting for site... (55)
    waiting for site... (56)
    waiting for site... (57)
    waiting for site... (58)
    waiting for site... (59)
    waiting for site... (60)
    waiting for site... (61)
    waiting for site... (62)
    waiting for site... (63)
    waiting for site... (64)
    waiting for site... (65)
    waiting for site... (66)
    waiting for site... (67)
    waiting for site... (68)
    waiting for site... (69)
    waiting for site... (70)
    waiting for site... (71)
    waiting for site... (72)
    waiting for site... (73)
    waiting for site... (74)
    waiting for site... (75)
    waiting for site... (76)
    waiting for site... (77)
    waiting for site... (78)
    waiting for site... (79)
    waiting for site... (80)
    waiting for site... (81)
    waiting for site... (82)
    waiting for site... (83)
    waiting for site... (84)
    waiting for site... (85)
    waiting for site... (86)
    waiting for site... (87)
    waiting for site... (88)
    waiting for site... (89)
    waiting for site... (90)
    waiting for site... (91)
    waiting for site... (92)
    waiting for site... (93)
    waiting for site... (94)
    waiting for site... (95)
    waiting for site... (96)
    waiting for site... (97)
    waiting for site... (98)
    waiting for site... (99)
    waiting for site... (100)
    waiting for site... (101)
    waiting for site... (102)
    waiting for site... (103)
    waiting for site... (104)
    waiting for site... (105)
    waiting for site... (106)
    waiting for site... (107)
    waiting for site... (108)
    waiting for site... (109)
    waiting for site... (110)
    waiting for site... (111)
    waiting for site... (112)
    waiting for site... (113)
    waiting for site... (114)
    waiting for site... (115)
    waiting for site... (116)
    waiting for site... (117)
    waiting for site... (118)
    waiting for site... (119)
    waiting for site... (120)
    waiting for site... (121)
    waiting for site... (122)
    waiting for site... (123)
    waiting for site... (124)
    waiting for site... (125)
    waiting for site... (126)
    waiting for site... (127)
    waiting for site... (128)
    waiting for site... (129)
    waiting for site... (130)
    waiting for site... (131)
    waiting for site... (132)
    waiting for site... (133)
    waiting for site... (134)
    waiting for site... (135)
    waiting for site... (136)
    waiting for site... (137)
    waiting for site... (138)
    waiting for site... (139)
    waiting for site... (140)
    waiting for site... (141)
    waiting for site... (142)
    waiting for site... (143)
    waiting for site... (144)
  • Starting PostgreSQL 9.5 database server
    ...done.
    WARNING: local_settings.py not found
    Traceback (most recent call last):
    File "manage.py", line 11, in
    execute_from_command_line(sys.argv)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/init.py", line 354, in execute_from_command_line
    utility.execute()
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/init.py", line 346, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 394, in run_from_argv
    self.execute(*args, **cmd_options)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 445, in execute
    output = self.handle(*args, **options)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/migrate.py", line 93, in handle
    executor = MigrationExecutor(connection, self.migration_progress_callback)
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 19, in init
    self.loader = MigrationLoader(self.connection)
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/loader.py", line 47, in init
    self.build_graph()
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/loader.py", line 191, in build_graph
    self.applied_migrations = recorder.applied_migrations()
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/recorder.py", line 59, in applied_migrations
    self.ensure_schema()
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/recorder.py", line 53, in ensure_schema
    editor.create_model(self.Migration)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/schema.py", line 286, in create_model
    self.execute(sql, params or None)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/schema.py", line 111, in execute
    cursor.execute(sql, params)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
    File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 98, in exit
    six.reraise(dj_exc_type, dj_exc_value, traceback)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 62, in execute
    return self.cursor.execute(sql)
    django.db.utils.ProgrammingError: no schema has been selected to create in
    LINE 1: CREATE TABLE "django_migrations" ("id" serial NOT NULL PRIMA...
    ^
    2020-06-26T06:52:12.725852319Z
    WARNING: local_settings.py not found
    Traceback (most recent call last):
    File "manage.py", line 11, in
    execute_from_command_line(sys.argv)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/init.py", line 354, in execute_from_command_line
    utility.execute()
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/init.py", line 346, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 394, in run_from_argv
    self.execute(*args, **cmd_options)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 445, in execute
    output = self.handle(*args, **options)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/migrate.py", line 93, in handle
    executor = MigrationExecutor(connection, self.migration_progress_callback)
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 19, in init
    self.loader = MigrationLoader(self.connection)
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/loader.py", line 47, in init
    self.build_graph()
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/loader.py", line 191, in build_graph
    self.applied_migrations = recorder.applied_migrations()
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/recorder.py", line 59, in applied_migrations
    self.ensure_schema()
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/recorder.py", line 53, in ensure_schema
    editor.create_model(self.Migration)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/schema.py", line 286, in create_model
    self.execute(sql, params or None)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/schema.py", line 111, in execute
    cursor.execute(sql, params)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
    File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 98, in exit
    six.reraise(dj_exc_type, dj_exc_value, traceback)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 62, in execute
    return self.cursor.execute(sql)
    django.db.utils.ProgrammingError: no schema has been selected to create in
    LINE 1: CREATE TABLE "django_migrations" ("id" serial NOT NULL PRIMA...
    ^
    2020-06-26T06:52:13.747660970Z
    WARNING: local_settings.py not found
    Traceback (most recent call last):
    File "manage.py", line 11, in
    execute_from_command_line(sys.argv)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/init.py", line 354, in execute_from_command_line
    utility.execute()
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/init.py", line 346, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/init.py", line 190, in fetch_command
    klass = load_command_class(app_name, subcommand)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/init.py", line 40, in load_command_class
    module = import_module('%s.management.commands.%s' % (app_name, name))
    File "/usr/lib/python2.7/importlib/init.py", line 37, in import_module
    import(name)
    File "/home/digipal/digipal/management/commands/dpsearch.py", line 11, in
    from digipal.views.faceted_search.search_indexer import SearchIndexer
    File "/home/digipal/digipal/views/faceted_search/search_indexer.py", line 4, in
    from digipal.views.faceted_search import faceted_search
    File "/home/digipal/digipal/views/faceted_search/faceted_search.py", line 5, in
    from digipal.forms import SearchPageForm
    File "/home/digipal/digipal/forms.py", line 44, in
    class ImageAnnotationForm(forms.Form):
    File "/home/digipal/digipal/forms.py", line 47, in ImageAnnotationForm
    if status_list:
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 170, in nonzero
    return type(self).bool(self)
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 166, in bool
    self._fetch_all()
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 965, in _fetch_all
    self._result_cache = list(self.iterator())
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 238, in iterator
    results = compiler.execute_sql()
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 840, in execute_sql
    cursor.execute(sql, params)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
    File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 98, in exit
    six.reraise(dj_exc_type, dj_exc_value, traceback)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
    django.db.utils.ProgrammingError: relation "digipal_status" does not exist
    LINE 1: ...atus"."created", "digipal_status"."modified" FROM "digipal_s...
    ^
    2020-06-26T06:52:58.592213391Z
    WARNING: local_settings.py not found
    Traceback (most recent call last):
    File "manage.py", line 11, in
    execute_from_command_line(sys.argv)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/init.py", line 354, in execute_from_command_line
    utility.execute()
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/init.py", line 346, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/init.py", line 190, in fetch_command
    klass = load_command_class(app_name, subcommand)
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/init.py", line 40, in load_command_class
    module = import_module('%s.management.commands.%s' % (app_name, name))
    File "/usr/lib/python2.7/importlib/init.py", line 37, in import_module
    import(name)
    File "/home/digipal/digipal/management/commands/dpsearch.py", line 11, in
    from digipal.views.faceted_search.search_indexer import SearchIndexer
    File "/home/digipal/digipal/views/faceted_search/search_indexer.py", line 4, in
    from digipal.views.faceted_search import faceted_search
    File "/home/digipal/digipal/views/faceted_search/faceted_search.py", line 5, in
    from digipal.forms import SearchPageForm
    File "/home/digipal/digipal/forms.py", line 44, in
    class ImageAnnotationForm(forms.Form):
    File "/home/digipal/digipal/forms.py", line 47, in ImageAnnotationForm
    if status_list:
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 170, in nonzero
    return type(self).bool(self)
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 166, in bool
    self._fetch_all()
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 965, in _fetch_all
    self._result_cache = list(self.iterator())
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 238, in iterator
    results = compiler.execute_sql()
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 840, in execute_sql
    cursor.execute(sql, params)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
    File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 98, in exit
    six.reraise(dj_exc_type, dj_exc_value, traceback)
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
    django.db.utils.ProgrammingError: relation "digipal_status" does not exist
    LINE 1: ...atus"."created", "digipal_status"."modified" FROM "digipal_s...
    ^
    2020-06-26T06:53:23.572970762Z
  • Stopping PostgreSQL 9.5 database server
    ...done.
    waiting for site... (1)
    2020-06-26 06:53:47,627 CRIT Supervisor running as root (no user in config file)
    2020-06-26 06:53:47,631 INFO supervisord started with pid 151
    waiting for site... (2)
    2020-06-26 06:53:48,633 INFO spawned: 'pgsql' with pid 158
    2020-06-26 06:53:48,635 INFO spawned: 'iipsrv' with pid 159
    2020-06-26 06:53:48,638 INFO spawned: 'django' with pid 160
    2020-06-26 06:53:48,640 INFO spawned: 'nginx' with pid 161
    waiting for site... (3)
    2020-06-26 06:53:50,624 INFO success: pgsql entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
    2020-06-26 06:53:50,624 INFO success: iipsrv entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
    2020-06-26 06:53:50,624 INFO success: django entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
    2020-06-26 06:53:50,624 INFO success: nginx entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
    waiting for site... (4)
    waiting for site... (5)
    waiting for site... (6)
    waiting for site... (7)
    waiting for site... (8)
    waiting for site... (9)
    waiting for site... (10)
    waiting for site... (11)
    waiting for site... (12)
    waiting for site... (13)
    waiting for site... (14)
    waiting for site... (15)
    waiting for site... (16)
    waiting for site... (17)
    waiting for site... (18)
    waiting for site... (19)
    waiting for site... (20)
    waiting for site... (21)
    waiting for site... (22)
    waiting for site... (23)
    waiting for site... (24)
    waiting for site... (25)
    waiting for site... (26)
    waiting for site... (27)
    waiting for site... (28)
    waiting for site... (29)
    waiting for site... (30)
    waiting for site... (31)
    waiting for site... (32)
    waiting for site... (33)
    waiting for site... (34)
    waiting for site... (35)
    waiting for site... (36)
    waiting for site... (37)
    waiting for site... (38)
    waiting for site... (39)
    waiting for site... (40)
    waiting for site... (41)
    waiting for site... (42)
    waiting for site... (43)
    waiting for site... (44)
    waiting for site... (45)
    waiting for site... (46)
    waiting for site... (47)
    waiting for site... (48)
    waiting for site... (49)
    waiting for site... (50)
    waiting for site... (51)
    waiting for site... (52)
    waiting for site... (53)
    waiting for site... (54)
    waiting for site... (55)
    waiting for site... (56)
    waiting for site... (57)
    waiting for site... (58)
    waiting for site... (59)
    waiting for site... (60)
    waiting for site... (61)
    waiting for site... (62)
    waiting for site... (63)
    waiting for site... (64)
    waiting for site... (65)
    waiting for site... (66)
    waiting for site... (67)
    waiting for site... (68)
    waiting for site... (69)
    waiting for site... (70)
    waiting for site... (71)
    waiting for site... (72)
    waiting for site... (73)
    waiting for site... (74)
    waiting for site... (75)
    waiting for site... (76)
    waiting for site... (77)
    waiting for site... (78)
    waiting for site... (79)
    waiting for site... (80)
    waiting for site... (81)
    waiting for site... (82)
    waiting for site... (83)
    waiting for site... (84)
    waiting for site... (85)
    waiting for site... (86)
    waiting for site... (87)
    waiting for site... (88)
    waiting for site... (89)
    waiting for site... (90)
    waiting for site... (91)
    waiting for site... (92)
    waiting for site... (93)
    waiting for site... (94)
    waiting for site... (95)
    waiting for site... (96)
    waiting for site... (97)
    waiting for site... (98)
    waiting for site... (99)
    waiting for site... (100)
    waiting for site... (101)
    waiting for site... (102)
    waiting for site... (103)
    waiting for site... (104)
    waiting for site... (105)
    waiting for site... (106)
    waiting for site... (107)
    waiting for site... (108)
    waiting for site... (109)
    waiting for site... (110)
    waiting for site... (111)
    waiting for site... (112)
    waiting for site... (113)
    waiting for site... (114)
    waiting for site... (115)
    waiting for site... (116)
    waiting for site... (117)
    waiting for site... (118)
    waiting for site... (119)
    waiting for site... (120)
    waiting for site... (121)
    waiting for site... (122)
    waiting for site... (123)
    waiting for site... (124)
    waiting for site... (125)
    waiting for site... (126)
    waiting for site... (127)
    waiting for site... (128)
    waiting for site... (129)
    waiting for site... (130)
    waiting for site... (131)
    waiting for site... (132)
    waiting for site... (133)
    waiting for site... (134)
    waiting for site... (135)
    waiting for site... (136)
    waiting for site... (137)
    waiting for site... (138)
    waiting for site... (139)
    waiting for site... (140)
    waiting for site... (141)
    waiting for site... (142)
    waiting for site... (143)
    waiting for site... (144)
    waiting for site... (145)
    waiting for site... (146)
    waiting for site... (147)
    waiting for site... (148)
    waiting for site... (149)
    waiting for site... (150)
    waiting for site... (151)
    waiting for site... (152)
    waiting for site... (153)
    waiting for site... (154)
    waiting for site... (155)
    waiting for site... (156)
    waiting for site... (157)
    waiting for site... (158)
    waiting for site... (159)
    waiting for site... (160)
    waiting for site... (161)
    waiting for site... (162)
    waiting for site... (163)
    waiting for site... (164)
    waiting for site... (165)
    waiting for site... (166)
    waiting for site... (167)
    waiting for site... (168)
    waiting for site... (169)
    waiting for site... (170)
    waiting for site... (171)
    waiting for site... (172)
    waiting for site... (173)
    waiting for site... (174)
    waiting for site... (175)
    waiting for site... (176)
    waiting for site... (177)
    waiting for site... (178)
    waiting for site... (179)
    waiting for site... (180)
    waiting for site... (181)
    waiting for site... (182)
    waiting for site... (183)
    waiting for site... (184)
    waiting for site... (185)
    waiting for site... (186)
    waiting for site... (187)
    waiting for site... (188)
    waiting for site... (189)
    waiting for site... (190)
    waiting for site... (191)
    waiting for site... (192)
    waiting for site... (193)
    waiting for site... (194)
    waiting for site... (195)
    waiting for site... (196)
    waiting for site... (197)
    waiting for site... (198)
    waiting for site... (199)
    waiting for site... (200)

Large Graph search results failing

Searches for large numbers of graphs with results set to 100/page seem to fail fairly consistently, presumably due to server timeout or similar.

Presumably this depends on the server setup, but I've tested it on two instances and both fail. Ideally it should fail gracefully.

Better support for SQLite

SQLite could be used for the personal edition of Archetype in order to simplify the installation process and the architecture of the running instance.

  • determine which queries are not compatible with SQLite
  • look at the functional implications of the differences SQLite introduces compared to Postgresql (e.g. case-sensitivity, concurrency)

Upgrade to Python 3 & Django 2

Python 2 won't be maintained past Jan 2020. Also Archetype is still on Django 1.8. Both need to be urgently upgraded as they are causing more and more trouble in terms of server settings, stack compatibility, and security concerns.

This is potentially a major task which will require between one and six weeks of development for one person. Upgrade and testing of individual instances should be relatively easy after that but will happen progressively.

Work and Version

One of our projects will use Archetype mainly for the genetic/critical edition of manuscripts because the research team is used to framework and find the Text Editor very convenient for editing texts with light markup.

Most of their needs are already covered by Archetype. There is, however, one dimension not yet supported by the data model: the notions of Work and Versions of a Work.

I'm thinking of adding a new Django app with two tables: Work and Version. They would link to the Text and the Item Part and have relatively little metadata attach to them. The main purpose is to allow to group texts by versions and versions by Work and exploit that grouping in the Text Editor and the Search page.

Any idea, objection, question?

Tidy up HTML/CSS/JS

The HTML, CSS and JS are fairly messy at the moment, with a lot of ad hoc hacks, so these should be restructured and tidied up, removing redundant classes and complying more closely with BootStrap structure. The Collection and Annotator pages also rely very heavily on JS, including HTML and inline styles all on client side; these should also be tidied up by creating a proper Django template and moving appropriate content there. Controls should also be abstracted properly, not built ad hoc by JS as they are now.

Docker Image - Externalise the Database

Mount the local drive and save the database on that mount so we can persist the data across framework instances. It would help with:

  • making the system easier to copy across machines
  • backup of the data
  • upgrading the framework without losing data

Change feature annotation in the database

I would like to change the name of a feature to a different name only for specific components. The new name is already being used, so I created a new component-feature association in the admin part. But I would like to change the annotations already done and map them with the new component-feature association. Which table shall I modify in the database?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.