wipo-gbd-transformation 1.1.47__py3-none-any.whl → 1.1.59__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of wipo-gbd-transformation might be problematic. Click here for more details.

Files changed (138) hide show
  1. gbdtransformation/brands/attm/template.yml +1 -2
  2. gbdtransformation/brands/bgtm/template.yml +1 -1
  3. gbdtransformation/brands/catm/filters.py +2 -1
  4. gbdtransformation/brands/catm/template.yml +10 -6
  5. gbdtransformation/brands/chtm/filters.py +159 -181
  6. gbdtransformation/brands/chtm/schema +79 -91
  7. gbdtransformation/brands/chtm/template.yml +97 -106
  8. gbdtransformation/brands/eetm/template.yml +1 -1
  9. gbdtransformation/brands/emtm/template.yml +1 -1
  10. gbdtransformation/brands/estm/template.yml +1 -1
  11. gbdtransformation/brands/frtm/template.yml +1 -1
  12. gbdtransformation/brands/gdtm/__init__.py +5 -0
  13. gbdtransformation/brands/gdtm/filters.py +61 -0
  14. gbdtransformation/brands/gdtm/schema +87 -0
  15. gbdtransformation/brands/gdtm/template.yml +1 -0
  16. gbdtransformation/brands/gdtm/tests/__init__.py +0 -0
  17. gbdtransformation/brands/istm/filters.py +21 -14
  18. gbdtransformation/brands/istm/template.yml +1 -1
  19. gbdtransformation/brands/krtm/template.yml +1 -1
  20. gbdtransformation/brands/lktm/__init__.py +5 -0
  21. gbdtransformation/brands/lktm/filters.py +83 -0
  22. gbdtransformation/brands/lktm/schema +87 -0
  23. gbdtransformation/brands/lktm/template.yml +1 -0
  24. gbdtransformation/brands/lktm/tests/__init__.py +0 -0
  25. gbdtransformation/brands/natm/__init__.py +2 -3
  26. gbdtransformation/brands/natm/filters.py +8 -2
  27. gbdtransformation/brands/notm/__init__.py +5 -0
  28. gbdtransformation/brands/notm/filters.py +113 -0
  29. gbdtransformation/brands/notm/template.yml +152 -0
  30. gbdtransformation/brands/nztm/template.yml +1 -1
  31. gbdtransformation/brands/phtm/schema +79 -50
  32. gbdtransformation/brands/phtm/schema.classic +50 -0
  33. gbdtransformation/brands/phtm/template.classic.yml +102 -0
  34. gbdtransformation/brands/phtm/template.yml +1 -102
  35. gbdtransformation/brands/qatm/__init__.py +5 -0
  36. gbdtransformation/brands/qatm/filters.py +81 -0
  37. gbdtransformation/brands/qatm/schema +87 -0
  38. gbdtransformation/brands/qatm/template.yml +1 -0
  39. gbdtransformation/brands/qatm/tests/__init__.py +0 -0
  40. gbdtransformation/brands/sgtm/filters.py +1 -1
  41. gbdtransformation/brands/sgtm/template.trademark.yml +2 -2
  42. gbdtransformation/brands/ustm/template.yml +1 -1
  43. gbdtransformation/brands/vctm/__init__.py +5 -0
  44. gbdtransformation/brands/vctm/filters.py +75 -0
  45. gbdtransformation/brands/vctm/schema +87 -0
  46. gbdtransformation/brands/vctm/template.yml +1 -0
  47. gbdtransformation/brands/vctm/tests/__init__.py +0 -0
  48. gbdtransformation/brands/vntm/filters.py +1 -3
  49. gbdtransformation/brands/xxxx/template.yml +1 -1
  50. gbdtransformation/designs/__init__.py +8 -0
  51. gbdtransformation/designs/alid/__init__.py +1 -1
  52. gbdtransformation/designs/alid/filters.py +14 -1
  53. gbdtransformation/designs/bnid/__init__.py +5 -0
  54. gbdtransformation/designs/bnid/filters.py +61 -0
  55. gbdtransformation/designs/bnid/schema +80 -0
  56. gbdtransformation/designs/bnid/template.yml +1 -0
  57. gbdtransformation/designs/bwid/__init__.py +6 -0
  58. gbdtransformation/designs/bwid/filters.py +64 -0
  59. gbdtransformation/designs/bwid/schema +101 -0
  60. gbdtransformation/designs/bwid/template.yml +1 -0
  61. gbdtransformation/designs/crid/__init__.py +5 -0
  62. gbdtransformation/designs/crid/filters.py +63 -0
  63. gbdtransformation/designs/crid/schema +94 -0
  64. gbdtransformation/designs/crid/template.yml +1 -0
  65. gbdtransformation/designs/cuid/__init__.py +5 -0
  66. gbdtransformation/designs/cuid/filters.py +60 -0
  67. gbdtransformation/designs/cuid/schema +98 -0
  68. gbdtransformation/designs/cuid/template.yml +1 -0
  69. gbdtransformation/designs/egid/__init__.py +5 -0
  70. gbdtransformation/designs/egid/filters.py +62 -0
  71. gbdtransformation/designs/egid/schema +82 -0
  72. gbdtransformation/designs/egid/template.yml +1 -0
  73. gbdtransformation/designs/filters.py +73 -0
  74. gbdtransformation/designs/idid/__init__.py +5 -0
  75. gbdtransformation/designs/idid/filters.py +67 -0
  76. gbdtransformation/designs/idid/schema +102 -0
  77. gbdtransformation/designs/idid/template.yml +1 -0
  78. gbdtransformation/designs/ipas/filters.py +84 -2
  79. gbdtransformation/designs/ipas/template.yml +90 -79
  80. gbdtransformation/designs/joid/__init__.py +6 -0
  81. gbdtransformation/designs/joid/filters.py +62 -0
  82. gbdtransformation/designs/joid/schema +97 -0
  83. gbdtransformation/designs/joid/template.yml +1 -0
  84. gbdtransformation/designs/keid/__init__.py +5 -0
  85. gbdtransformation/designs/keid/filters.py +62 -0
  86. gbdtransformation/designs/keid/schema +99 -0
  87. gbdtransformation/designs/keid/template.yml +1 -0
  88. gbdtransformation/designs/khid/__init__.py +5 -0
  89. gbdtransformation/designs/khid/filters.py +63 -0
  90. gbdtransformation/designs/khid/schema +100 -0
  91. gbdtransformation/designs/khid/template.yml +1 -0
  92. gbdtransformation/designs/laid/__init__.py +5 -0
  93. gbdtransformation/designs/laid/filters.py +61 -0
  94. gbdtransformation/designs/laid/schema +94 -0
  95. gbdtransformation/designs/laid/template.yml +1 -0
  96. gbdtransformation/designs/mnid/__init__.py +6 -0
  97. gbdtransformation/designs/mnid/filters.py +62 -0
  98. gbdtransformation/designs/mnid/schema +98 -0
  99. gbdtransformation/designs/mnid/template.yml +1 -0
  100. gbdtransformation/designs/myid/__init__.py +5 -0
  101. gbdtransformation/designs/myid/filters.py +60 -0
  102. gbdtransformation/designs/myid/schema +95 -0
  103. gbdtransformation/designs/myid/template.yml +1 -0
  104. gbdtransformation/designs/phid/__init__.py +5 -0
  105. gbdtransformation/designs/phid/filters.py +70 -0
  106. gbdtransformation/designs/phid/schema +95 -0
  107. gbdtransformation/designs/phid/template.yml +1 -0
  108. gbdtransformation/designs/sgid/__init__.py +6 -0
  109. gbdtransformation/designs/sgid/filters.py +66 -0
  110. gbdtransformation/designs/sgid/schema +115 -0
  111. gbdtransformation/designs/sgid/template.yml +1 -0
  112. gbdtransformation/designs/thid/__init__.py +4 -0
  113. gbdtransformation/designs/thid/filters.py +64 -0
  114. gbdtransformation/designs/thid/schema +98 -0
  115. gbdtransformation/designs/thid/template.yml +1 -0
  116. gbdtransformation/designs/tnid/__init__.py +5 -0
  117. gbdtransformation/designs/tnid/filters.py +66 -0
  118. gbdtransformation/designs/tnid/schema +96 -0
  119. gbdtransformation/designs/tnid/template.yml +1 -0
  120. gbdtransformation/designs/vnid/__init__.py +5 -0
  121. gbdtransformation/designs/vnid/filters.py +62 -0
  122. gbdtransformation/designs/vnid/schema +97 -0
  123. gbdtransformation/designs/vnid/template.yml +1 -0
  124. gbdtransformation/designs/woid/__init__.py +2 -0
  125. gbdtransformation/designs/woid/filters.py +372 -0
  126. gbdtransformation/designs/woid/schema +592 -0
  127. gbdtransformation/designs/woid/template.yml +516 -0
  128. gbdtransformation/designs/xxid/template.yml +331 -119
  129. gbdtransformation/execs-nico.py +709 -0
  130. gbdtransformation/execs.py +55 -4
  131. gbdtransformation/gbd-transform.exec.tgz +0 -0
  132. {wipo_gbd_transformation-1.1.47.dist-info → wipo_gbd_transformation-1.1.59.dist-info}/METADATA +4 -1
  133. {wipo_gbd_transformation-1.1.47.dist-info → wipo_gbd_transformation-1.1.59.dist-info}/RECORD +138 -38
  134. wipo_gbd_transformation-1.1.59.dist-info/SOURCES_Stefans-Mac-Studio.local_Sep-18-063455-2024_Conflict.txt +690 -0
  135. {wipo_gbd_transformation-1.1.47.dist-info → wipo_gbd_transformation-1.1.59.dist-info}/entry_points.txt +1 -0
  136. {wipo_gbd_transformation-1.1.47.dist-info → wipo_gbd_transformation-1.1.59.dist-info}/LICENSE.md +0 -0
  137. {wipo_gbd_transformation-1.1.47.dist-info → wipo_gbd_transformation-1.1.59.dist-info}/WHEEL +0 -0
  138. {wipo_gbd_transformation-1.1.47.dist-info → wipo_gbd_transformation-1.1.59.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,62 @@
1
+ # standard gbd definitions
2
+ import gbdtransformation.designs.ipas.filters as ipas
3
+
4
+
5
+ # namespaces defined in XML and to be ignored in procecssing
6
+ ignore_namespace = [
7
+ 'http://www.wipo.int/standards/XMLSchema/designs',
8
+ 'http://www.wipo.int/standards/XMLSchema/wo-designs'
9
+ ]
10
+ def get_appdate(appdate, appnum):
11
+ return appdate
12
+
13
+ def get_designs_count(design, header):
14
+ return '1'
15
+
16
+ def get_designs_pos(design, header):
17
+ return '1'
18
+
19
+ def translate_kind(desgin, header):
20
+ code = header.TransactionCode.lower()
21
+ subcode = header.TransactionSubCode.lower()
22
+ if code == 'نموذج صناعي':
23
+ return 'Industrial Design'
24
+ raise Exception('Type "%s" "%s" is not mapped.' % (code, subcode))
25
+
26
+ def translate_status(design):
27
+ status = design.DesignCurrentStatusCode
28
+
29
+ return ipas.translate_status(status)
30
+
31
+
32
+ def get_registration_nb(design, idstatus):
33
+ if design.RegistrationNumber:
34
+ return design.RegistrationNumber
35
+
36
+ return None
37
+
38
+
39
+ def get_expiry_date(design, idstatus):
40
+ return ipas.get_expiry_date(design, idstatus)
41
+
42
+ def get_registration_date(design, idstatus):
43
+ return ipas.get_registration_date(design, idstatus)
44
+
45
+ def is_international(header):
46
+ return False
47
+
48
+ def get_ir_refnum(appnum):
49
+ return appnum
50
+
51
+ def select_earliest_date(publications):
52
+ return ipas.select_earliest_date(publications)
53
+
54
+ def deduplicate_publication_dates(publications):
55
+ return ipas.deduplicate_publication_dates(publications)
56
+
57
+ def deduplicate_classes(classes):
58
+ return ipas.deduplicate_classes(classes)
59
+
60
+ def deduplicate_publications(publications):
61
+ return ipas.deduplicate_publications(publications)
62
+
@@ -0,0 +1,82 @@
1
+ /Transaction
2
+ __/DesignTransactionBody
3
+ ____/TransactionContentDetails
4
+ ______/TransactionCode
5
+ ______/TransactionData
6
+ ________/DesignApplicationDetails
7
+ __________/DesignApplication
8
+ ____________/ApplicantDetails
9
+ ______________/ApplicantKey
10
+ ____________/DesignApplicationDate
11
+ ____________/DesignApplicationLanguageCode
12
+ ____________/DesignApplicationNumber
13
+ ____________/DesignDetails
14
+ ______________/Design
15
+ ________________/ApplicantDetails
16
+ __________________/Applicant
17
+ ____________________/ApplicantAddressBook
18
+ ______________________/FormattedNameAddress
19
+ ________________________/Address
20
+ __________________________/AddressCountryCode
21
+ __________________________/FreeFormatAddress
22
+ ____________________________/FreeFormatAddressLine
23
+ ________________________/Name
24
+ __________________________/FreeFormatName
25
+ ____________________________/FreeFormatNameDetails
26
+ ______________________________/FreeFormatNameLine
27
+ ______________________________/FreeFormatNameLine[@languageCode=ar]
28
+ ________________/DesignCurrentStatusCode
29
+ ________________/DesignCurrentStatusDate
30
+ ________________/DesignDescription
31
+ ________________/DesignIdentifier
32
+ ________________/DesignRepresentationSheetDetails
33
+ __________________/DesignRepresentationSheet
34
+ ____________________/RepresentationSheetFilename
35
+ ________________/DesignSpecimenDetails
36
+ __________________/DesignSpecimen
37
+ ____________________/SpecimenDescription
38
+ ____________________/SpecimenDescription[@languageCode=ar]
39
+ ____________________/SpecimenIdentifier
40
+ ________________/DesignTitle
41
+ ________________/DesignTitle[@languageCode=ar]
42
+ ________________/DesignTitle[@languageCode=en]
43
+ ________________/DesignTitle[@sequenceNumber=1]
44
+ ________________/ExpiryDate
45
+ ________________/IndicationProductDetails
46
+ __________________/IndicationProduct
47
+ ____________________/ClassDescriptionDetails
48
+ ______________________/ClassDescription
49
+ ________________________/ClassNumber
50
+ ________________________/ProductDescription
51
+ ____________________/ClassificationKindCode
52
+ ____________________/ClassificationVersion
53
+ ________________/NoveltyStatement
54
+ ________________/NoveltyStatement[@languageCode=ar]
55
+ ________________/NoveltyStatement[@languageCode=en]
56
+ ________________/PriorityDetails
57
+ __________________/Priority
58
+ ____________________/PriorityCountryCode
59
+ ____________________/PriorityDate
60
+ ____________________/PriorityNumber
61
+ ________________/PublicationDetails
62
+ __________________/Publication
63
+ ____________________/PublicationDate
64
+ ____________________/PublicationIdentifier
65
+ ________________/RegistrationDate
66
+ ________________/RegistrationNumber
67
+ ________________/RepresentativeDetails
68
+ __________________/Representative
69
+ ____________________/RepresentativeAddressBook
70
+ ______________________/FormattedNameAddress
71
+ ________________________/Address
72
+ __________________________/AddressCountryCode
73
+ __________________________/FreeFormatAddress
74
+ ____________________________/FreeFormatAddressLine
75
+ ________________________/Name
76
+ __________________________/FreeFormatName
77
+ ____________________________/FreeFormatNameDetails
78
+ ______________________________/FreeFormatNameLine
79
+ ______________________________/FreeFormatNameLine[@languageCode=ar]
80
+ ____________/RegistrationOfficeCode
81
+ ______/TransactionIdentifier
82
+ ______/TransactionSubCode
@@ -0,0 +1 @@
1
+ {% include "ipas/template.yml" %}
@@ -0,0 +1,73 @@
1
+ import re
2
+ from gbdtransformation.designs import st13_identifier
3
+ from gbdtransformation.common.filters import *
4
+
5
+ def parseStatus(status):
6
+ """ Function is here to be overriden in child elements( e.g BRTM)"""
7
+ return status
8
+
9
+ def pad_locarno(data, separator='-'):
10
+ """Convert to locarno style with padding"""
11
+ if separator in data:
12
+ slice = data.split(separator)
13
+ return slice[0].zfill(2) + '-' + pad_locarno('-'.join(slice[1:]))
14
+ return data.zfill(2)
15
+
16
+ def should_display_language(lang, payload):
17
+ if payload:
18
+ return lang
19
+ return None
20
+
21
+ def st13(appnum, registration_number, office, pos, type='Design', appdate=None, roffice=None, sanitize=True):
22
+ if not appnum:
23
+ # fallback to registration number (required for example by Hague pre-1999 records, which have no application number)
24
+ if registration_number:
25
+ # remove non digit prefix (we want to keep non digit char at the end of the registration number, to distinguish
26
+ # non unitary registration numbers from the same application, e.g. D054966 and D054966A)
27
+ registration_number = re.sub(r"^[^0-9]+", '', registration_number)
28
+ appnum = 'R' + registration_number
29
+ else:
30
+ return None
31
+ # collections are usually office code followed with tm: xxtm
32
+ collection = '%sid' % office.lower()
33
+
34
+ module_pckg = load_collection_package('designs', collection)
35
+ try:
36
+ masks = getattr(module_pckg, 'appnum_mask')
37
+ if not isinstance(masks, list): masks = [masks]
38
+ except:
39
+ masks = ['(.*)']
40
+
41
+ try:
42
+ source = getattr(module_pckg, 'source')
43
+ except:
44
+ source = 'national'
45
+ matches = None
46
+ for mask in masks:
47
+ regex = re.compile('^%s$' % mask)
48
+ matches = regex.search(appnum)
49
+ if matches:
50
+ break
51
+
52
+ if not matches:
53
+ raise Exception('could not apply appnum mask %s on %s' % (mask, appnum))
54
+
55
+ #print(appnum, ''.join(matches.groups()))
56
+ appnum = ''.join(matches.groups())
57
+
58
+ prefix = st13_identifier[source.lower()][type.lower()]
59
+ if sanitize:
60
+ # remove special characters
61
+ special_chars = re.compile(r'\W')
62
+ appnum = special_chars.sub('', appnum)
63
+
64
+ # reference office (only relevant for inerantional)
65
+ if roffice and roffice != office:
66
+ appnum = '%s%s' % (roffice.upper(), appnum)
67
+
68
+ st13 = '%s%s' % (office.upper(), prefix)
69
+ if appdate:
70
+ st13 = '%s%s' % (st13, appdate[:4])
71
+
72
+ # add application number and zfill till 17
73
+ return '%s%s' % (st13, appnum.zfill(17 - len(st13)))
@@ -0,0 +1,5 @@
1
+ render = 'JSON'
2
+ source = 'national'
3
+
4
+ # AID2018000076
5
+ appnum_mask = ['A(\\d*)', 'AID\\d{4}(\\d*)']
@@ -0,0 +1,67 @@
1
+ # standard gbd definitions
2
+ import gbdtransformation.designs.ipas.filters as ipas
3
+ import re
4
+
5
+ # namespaces defined in XML and to be ignored in procecssing
6
+ ignore_namespace = [
7
+ 'http://www.wipo.int/standards/XMLSchema/designs',
8
+ 'http://www.wipo.int/standards/XMLSchema/wo-designs'
9
+ ]
10
+ def get_appdate(appdate, appnum):
11
+ mask = 'AID(\\d{4})\\d*'
12
+ regex = re.compile('^%s$' % mask)
13
+ matches = regex.search(appnum)
14
+ if matches:
15
+ return ''.join(matches.groups())
16
+ return appdate
17
+
18
+ def get_designs_count(design, header):
19
+ return '1'
20
+
21
+ def get_designs_pos(design, header):
22
+ return '1'
23
+
24
+ def translate_kind(desgin, header):
25
+ code = header.TransactionCode.lower()
26
+ subcode = header.TransactionSubCode.lower()
27
+ if code == 'desain industri':
28
+ return 'Industrial Design'
29
+ raise Exception('Type "%s" "%s" is not mapped.' % (code, subcode))
30
+
31
+ def translate_status(design):
32
+ status = design.DesignCurrentStatusCode
33
+
34
+ return ipas.translate_status(status)
35
+
36
+
37
+ def get_registration_nb(design, idstatus):
38
+ if design.RegistrationNumber:
39
+ return design.RegistrationNumber
40
+
41
+ return None
42
+
43
+
44
+ def get_expiry_date(design, idstatus):
45
+ return ipas.get_expiry_date(design, idstatus)
46
+
47
+ def get_registration_date(design, idstatus):
48
+ return ipas.get_registration_date(design, idstatus)
49
+
50
+ def is_international(header):
51
+ return False
52
+
53
+ def get_ir_refnum(appnum):
54
+ return appnum
55
+
56
+ def select_earliest_date(publications):
57
+ return ipas.select_earliest_date(publications)
58
+
59
+ def deduplicate_publication_dates(publications):
60
+ return ipas.deduplicate_publication_dates(publications)
61
+
62
+ def deduplicate_classes(classes):
63
+ return ipas.deduplicate_classes(classes)
64
+
65
+ def deduplicate_publications(publications):
66
+ return ipas.deduplicate_publications(publications)
67
+
@@ -0,0 +1,102 @@
1
+ /Transaction
2
+ __/DesignTransactionBody
3
+ ____/TransactionContentDetails
4
+ ______/TransactionCode
5
+ ______/TransactionData
6
+ ________/DesignApplicationDetails
7
+ __________/DesignApplication
8
+ ____________/ApplicantDetails
9
+ ______________/ApplicantKey
10
+ ____________/DesignApplicationDate
11
+ ____________/DesignApplicationLanguageCode
12
+ ____________/DesignApplicationNumber
13
+ ____________/DesignDetails
14
+ ______________/Design
15
+ ________________/ApplicantDetails
16
+ __________________/Applicant
17
+ ____________________/ApplicantAddressBook
18
+ ______________________/FormattedNameAddress
19
+ ________________________/Address
20
+ __________________________/AddressCountryCode
21
+ __________________________/FreeFormatAddress
22
+ ____________________________/FreeFormatAddressLine
23
+ ________________________/Name
24
+ __________________________/FreeFormatName
25
+ ____________________________/FreeFormatNameDetails
26
+ ______________________________/FreeFormatNameLine
27
+ ______________________________/FreeFormatNameLine[@languageCode=in]
28
+ ________________/DesignCurrentStatusCode
29
+ ________________/DesignCurrentStatusDate
30
+ ________________/DesignDescription
31
+ ________________/DesignEventDetails
32
+ __________________/DesignEvent
33
+ ____________________/DesignEventCode
34
+ ____________________/DesignEventDate
35
+ ____________________/OfficeSpecificDesignEventCode
36
+ ____________________/OfficeSpecificDesignEventDescription
37
+ ____________________/OfficeSpecificDesignEventDescription[@languageCode=in]
38
+ ____________________/OfficeSpecificDesignEventName
39
+ ________________/DesignIdentifier
40
+ ________________/DesignRepresentationSheetDetails
41
+ __________________/DesignRepresentationSheet
42
+ ____________________/RepresentationSheetFilename
43
+ ________________/DesignSpecimenDetails
44
+ __________________/DesignSpecimen
45
+ ____________________/SpecimenDescription
46
+ ____________________/SpecimenDescription[@languageCode=in]
47
+ ____________________/SpecimenIdentifier
48
+ ________________/DesignTitle
49
+ ________________/DesignTitle[@languageCode=in]
50
+ ________________/DesignTitle[@sequenceNumber=1]
51
+ ________________/DesignerDetails
52
+ __________________/Designer
53
+ ____________________/DesignerAddressBook
54
+ ______________________/FormattedNameAddress
55
+ ________________________/Address
56
+ __________________________/AddressCountryCode
57
+ __________________________/FreeFormatAddress
58
+ ____________________________/FreeFormatAddressLine
59
+ ________________________/Name
60
+ __________________________/FreeFormatName
61
+ ____________________________/FreeFormatNameDetails
62
+ ______________________________/FreeFormatNameLine
63
+ ______________________________/FreeFormatNameLine[@languageCode=in]
64
+ ________________/ExpiryDate
65
+ ________________/IndicationProductDetails
66
+ __________________/IndicationProduct
67
+ ____________________/ClassDescriptionDetails
68
+ ______________________/ClassDescription
69
+ ________________________/ClassNumber
70
+ ________________________/ProductDescription
71
+ ____________________/ClassificationKindCode
72
+ ____________________/ClassificationVersion
73
+ ________________/NoveltyStatement
74
+ ________________/NoveltyStatement[@languageCode=]
75
+ ________________/NoveltyStatement[@languageCode=in]
76
+ ________________/PriorityDetails
77
+ __________________/Priority
78
+ ____________________/PriorityCountryCode
79
+ ____________________/PriorityDate
80
+ ____________________/PriorityNumber
81
+ ________________/PublicationDetails
82
+ __________________/Publication
83
+ ____________________/PublicationDate
84
+ ____________________/PublicationIdentifier
85
+ ________________/RegistrationDate
86
+ ________________/RegistrationNumber
87
+ ________________/RepresentativeDetails
88
+ __________________/Representative
89
+ ____________________/RepresentativeAddressBook
90
+ ______________________/FormattedNameAddress
91
+ ________________________/Address
92
+ __________________________/AddressCountryCode
93
+ __________________________/FreeFormatAddress
94
+ ____________________________/FreeFormatAddressLine
95
+ ________________________/Name
96
+ __________________________/FreeFormatName
97
+ ____________________________/FreeFormatNameDetails
98
+ ______________________________/FreeFormatNameLine
99
+ ______________________________/FreeFormatNameLine[@languageCode=in]
100
+ ____________/RegistrationOfficeCode
101
+ ______/TransactionIdentifier
102
+ ______/TransactionSubCode
@@ -0,0 +1 @@
1
+ {% include "ipas/template.yml" %}
@@ -1,7 +1,6 @@
1
- # standard gbd definitions
1
+ # standard gdd definitions
2
2
  from gbdtransformation.designs import kinds as std_kinds
3
3
  from gbdtransformation.designs import status as std_status
4
- from gbdtransformation.brands import events as std_events
5
4
 
6
5
  # namespaces defined in XML and to be ignored in procecssing
7
6
  ignore_namespace = []
@@ -65,6 +64,89 @@ def get_registration_date(trademark, tmstatus):
65
64
  if event.MarkEventCode == 'Published':
66
65
  return event.MarkEventDate
67
66
 
67
+ # given a list of dates as strings, e.g. publication dates, deduplicate
68
+ def deduplicate_dates(dates):
69
+ return list(set(dates))
70
+
71
+ # given a list of publications, deduplicate
72
+ def deduplicate_publication_dates(design):
73
+ if design == None:
74
+ return None
75
+ dates = []
76
+ if "PublicationDetails" in design:
77
+ publicationDetails = design["PublicationDetails"]
78
+ publications = publicationDetails.get('Publication', [])
79
+ if not isinstance(publications, list):
80
+ publications = [publications]
81
+ for publication in publications:
82
+ if "PublicationDate" in publication:
83
+ dates.append(publication["PublicationDate"])
84
+ return deduplicate_dates(dates)
85
+
86
+ # given a list of classes, deduplicate
87
+ def deduplicate_classes(classes):
88
+ deduplicate_classes = []
89
+ if not isinstance(classes, list):
90
+ classes = [classes]
91
+ for the_class in classes:
92
+ if the_class["ClassNumber"] not in deduplicate_classes:
93
+ deduplicate_classes.append(the_class["ClassNumber"])
94
+ result = []
95
+ for deduplicate_class in deduplicate_classes:
96
+ result.append({ "code": deduplicate_class} )
97
+ return result
98
+
99
+ # given a list of publications, deduplicate
100
+ def deduplicate_publications(publications):
101
+ deduplicate_publications = []
102
+ pub_keys = []
103
+ if not isinstance(publications, list):
104
+ publications = [publications]
105
+ for publication in publications:
106
+ publication_date = publication.get("PublicationDate")
107
+ publication_identifier = publication.get("PublicationIdentifier")
108
+ pub_key = ""
109
+ if publication_identifier:
110
+ pub_key += publication_identifier
111
+ if publication_date:
112
+ pub_key += publication_date
113
+ if pub_key not in pub_keys:
114
+ deduplicate_publications.append(publication)
115
+ pub_keys.append(pub_key)
116
+ result = []
117
+ for publication in deduplicate_publications:
118
+ res = {}
119
+ if "PublicationIdentifier" in publication:
120
+ res["identifier"] = publication["PublicationIdentifier"]
121
+ if "PublicationDate" in publication:
122
+ res["date"] = publication["PublicationDate"]
123
+ result.append(res)
124
+ return result
125
+
126
+ # given a list of publications with dates as strings, select the earliest date publication
127
+ def select_earliest_date(design):
128
+ if design == None:
129
+ return None
130
+
131
+ if "PublicationDetails" in design:
132
+ publicationDetails = design["PublicationDetails"]
133
+ publications = publicationDetails.get('Publication', [])
134
+ if not isinstance(publications, list):
135
+ publications = [publications]
136
+ if len(publications) == 0:
137
+ return None
138
+ elif len(publications) == 1:
139
+ return publications[0]["PublicationDate"]
140
+ else:
141
+ earliest_date = None
142
+ n = -1
143
+ for count, publication in enumerate(publications):
144
+ if earliest_date == None or publication["PublicationDate"] < earliest_date:
145
+ earliest_date = publication["PublicationDate"]
146
+ return earliest_date
147
+ else:
148
+ return None
149
+
68
150
  def translate_status(status):
69
151
  status = status.lower()
70
152