[hooks] Use file categories vocabulary by default for mime type and format id lists
authorSylvain Thénault <sylvain.thenault@logilab.fr>
Fri, 03 Nov 2017 12:03:16 +0100
changeset 2865 5d0adc66a950
parent 2864 11196b772ee1
child 2866 e2cdb08a7e12
[hooks] Use file categories vocabulary by default for mime type and format id lists so by default it's the master vocabulary and MIME types / PRONOM vocabularies don't have to be kept in sync. Keep the synchronization mecanism though, and test it separatly.
cubicweb_seda/hooks.py
doc/vocabulaires.rst
test/test_hooks.py
test/test_profile_generation.py
test/test_schema.py
--- a/cubicweb_seda/hooks.py	Fri Nov 03 12:01:15 2017 +0100
+++ b/cubicweb_seda/hooks.py	Fri Nov 03 12:03:16 2017 +0100
@@ -179,12 +179,10 @@
 
 class SetDefaultCodeListVersionsOp(hook.Operation):
     """Set sensible default values for a transfer's code list versions."""
-    # XXX factorize with data structure in dataimport
+    # XXX factorize with data structure in dataimport?
     complex_rtypes = [
-        ('seda_file_format_code_list_version', 'seda_format_id_to', None),
         ('seda_message_digest_algorithm_code_list_version', 'seda_algorithm',
          'SEDABinaryDataObject'),
-        ('seda_mime_type_code_list_version', 'seda_mime_type_to', None),
         ('seda_encoding_code_list_version', 'seda_encoding_to', None),
         ('seda_data_object_version_code_list_version', 'seda_data_object_version_to', None),
         ('seda_relationship_code_list_version', 'seda_type_relationship', None),
@@ -196,6 +194,12 @@
         # 'seda_reuse_rule_code_list_version',
         # 'seda_storage_rule_code_list_version',
         # 'seda_acquisition_information_code_list_version',
+
+        # instead of linking those two to vocabularies related to their
+        # respective relation (seda_format_id_to and seda_mime_type_to), use the
+        # file categories vocabulary for conveniency
+        ('seda_file_format_code_list_version', 'file_category', None),
+        ('seda_mime_type_code_list_version', 'file_category', None),
     ]
 
     def precommit_event(self):
--- a/doc/vocabulaires.rst	Fri Nov 03 12:01:15 2017 +0100
+++ b/doc/vocabulaires.rst	Fri Nov 03 12:03:16 2017 +0100
@@ -54,7 +54,16 @@
 Lorsqu'une ou plusieurs valeurs sont sélectionnées pour la catégorie de fichier
 d'un objet-données d'un profil, une jointure est effectuée sur le nom des type
 MIME et identifiants de format sous-jacent avec les vocabulaires "types MIME" et
-"formats de fichier" sélectionnés pour ce profil (donc des vocabulaires "Types
-MIME" et "Formats de fichier (PRONOM)" dans le cas des profils simplifiés). Lors
-de la maintenance de ce vocabulaire il convient donc de s'assurer de sa
-cohérence avec les vocabulaires adéquats (a minima les deux sus-cités).
+"formats de fichier" sélectionnés pour ce profil. Par défaut, le vocabulaire
+sélectionné pour ces deux champs et le vocabulaire "Catégories de fichier" (ce
+qui autorise théoriquement des valeurs supplémentaires indésirées pour chacun
+des champs mais reste un choix pragmatique) et celui-ci reflêtera donc seul les
+valeurs exportables.
+
+Dans le cas d'un profil complet avec des vocabulaires spécifiques pour les
+listes "types MIME" et "formats de fichier" (par exemple en utilisant les
+vocabulaires dédiés "Types MIME" et/ou "Formats de fichier (PRONOM)") il
+conviendra de s'assurer de la cohérence du vocabulaire "Catégories de fichier"
+avec les vocabulaires sélectionnés car les valeurs exportées seront
+l'intersection entre les valeurs spécifiées via la catégorie / extension du
+fichier et les valeurs disponibles dans l'un ou l'autre vocabulaire.
--- a/test/test_hooks.py	Fri Nov 03 12:01:15 2017 +0100
+++ b/test/test_hooks.py	Fri Nov 03 12:03:16 2017 +0100
@@ -129,8 +129,7 @@
 
     def test_default_code_list_version(self):
         with self.admin_access.cnx() as cnx:
-            for rtype, etype in chain(zip(('seda_format_id_to', 'seda_mime_type_to',
-                                           'seda_encoding_to'),
+            for rtype, etype in chain(zip(('file_category', 'seda_encoding_to'),
                                           repeat(None)),
                                       [('seda_algorithm', 'SEDABinaryDataObject'),
                                        ('seda_rule', 'SEDASeqAppraisalRuleRule'),
@@ -219,11 +218,6 @@
 class DispatchFileCategoryTC(CubicWebTC):
     def setup_database(self):
         with self.admin_access.cnx() as cnx:
-            testutils.scheme_for_type(cnx, 'seda_format_id_to', None,
-                                      u'fmt/37', u'fmt/38', u'fmt/14')
-            testutils.scheme_for_type(cnx, 'seda_mime_type_to', None,
-                                      u'application/msword', u'application/pdf')
-            concepts = dict(cnx.execute('Any LL, C WHERE L label_of C, L label LL'))
             dataimport.import_seda_schemes(cnx, lcsv_files=[
                 (u'Categories de fichier',
                  'file_category', (),
@@ -283,6 +277,27 @@
                                    ['application/msword', 'application/pdf'],
                                    ['fmt/37', 'fmt/38', 'fmt/14'])
 
+    def test_join(self):
+        with self.admin_access.cnx() as cnx:
+            transfer = cnx.entity_from_eid(self.transfer_eid)
+            bdo = cnx.entity_from_eid(self.bdo_eid)
+
+            formats = testutils.scheme_for_type(cnx, 'seda_format_id_to', None,
+                                                u'fmt/37', u'fmt/14')
+            mime_types = testutils.scheme_for_type(cnx, 'seda_mime_type_to', None,
+                                                   u'application/msword', u'application/pdf')
+            transfer.reverse_seda_file_format_code_list_version_from[0].cw_set(
+                seda_file_format_code_list_version_to=formats)
+            transfer.reverse_seda_mime_type_code_list_version_from[0].cw_set(
+                seda_mime_type_code_list_version_to=mime_types)
+            cnx.commit()
+
+            bdo.cw_set(file_category=self.categories['document'])
+            cnx.commit()
+            self.assertFormatEqual(bdo,
+                                   ['application/msword', 'application/pdf'],
+                                   ['fmt/37', 'fmt/14'])
+
     def assertFormatEqual(self, bdo, expected_mime_types, expected_format_ids):
         bdo.cw_clear_all_caches()
         bdo.reverse_seda_mime_type_from[0].cw_clear_all_caches()
--- a/test/test_profile_generation.py	Fri Nov 03 12:01:15 2017 +0100
+++ b/test/test_profile_generation.py	Fri Nov 03 12:03:16 2017 +0100
@@ -734,7 +734,7 @@
 
             concepts = {}
             for rtype, etype, labels in [
-                    ('seda_format_id_to', None, [u'fmt/123', u'fmt/987']),
+                    ('file_category', None, [u'fmt/123', u'fmt/987']),
                     ('seda_encoding_to', None, [u'6']),
                     ('seda_type_to', None, [u'CDO']),
                     ('seda_description_level', None, [u'file']),
--- a/test/test_schema.py	Fri Nov 03 12:01:15 2017 +0100
+++ b/test/test_schema.py	Fri Nov 03 12:03:16 2017 +0100
@@ -29,7 +29,7 @@
 
     def setup_database(self):
         with self.admin_access.cnx() as cnx:
-            mt_scheme = testutils.scheme_for_type(cnx, 'seda_mime_type_to', None)
+            mt_scheme = testutils.scheme_for_type(cnx, 'file_category', None)
             mt_concept = mt_scheme.add_concept(label=u'text/plain')
             enc_scheme = testutils.scheme_for_type(cnx, 'seda_encoding_to', None)
             enc_concept = enc_scheme.add_concept(label=u'utf-8')