wipo-gbd-transformation 1.1.46__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.
- gbdtransformation/brands/attm/template.yml +1 -2
- gbdtransformation/brands/bgtm/template.yml +1 -1
- gbdtransformation/brands/catm/filters.py +2 -1
- gbdtransformation/brands/catm/template.yml +10 -6
- gbdtransformation/brands/chtm/filters.py +159 -181
- gbdtransformation/brands/chtm/schema +79 -91
- gbdtransformation/brands/chtm/template.yml +97 -106
- gbdtransformation/brands/eetm/template.yml +1 -1
- gbdtransformation/brands/emtm/template.yml +1 -1
- gbdtransformation/brands/estm/template.yml +1 -1
- gbdtransformation/brands/frtm/template.yml +1 -1
- gbdtransformation/brands/gdtm/__init__.py +5 -0
- gbdtransformation/brands/gdtm/filters.py +61 -0
- gbdtransformation/brands/gdtm/schema +87 -0
- gbdtransformation/brands/gdtm/template.yml +1 -0
- gbdtransformation/brands/gdtm/tests/__init__.py +0 -0
- gbdtransformation/brands/istm/filters.py +21 -11
- gbdtransformation/brands/istm/template.yml +1 -1
- gbdtransformation/brands/krtm/template.yml +1 -1
- gbdtransformation/brands/lktm/__init__.py +5 -0
- gbdtransformation/brands/lktm/filters.py +83 -0
- gbdtransformation/brands/lktm/schema +87 -0
- gbdtransformation/brands/lktm/template.yml +1 -0
- gbdtransformation/brands/lktm/tests/__init__.py +0 -0
- gbdtransformation/brands/natm/__init__.py +2 -3
- gbdtransformation/brands/natm/filters.py +8 -2
- gbdtransformation/brands/notm/__init__.py +5 -0
- gbdtransformation/brands/notm/filters.py +113 -0
- gbdtransformation/brands/notm/template.yml +152 -0
- gbdtransformation/brands/nztm/template.yml +1 -1
- gbdtransformation/brands/pgtm/filters.py +1 -0
- gbdtransformation/brands/phtm/schema +79 -50
- gbdtransformation/brands/phtm/schema.classic +50 -0
- gbdtransformation/brands/phtm/template.classic.yml +102 -0
- gbdtransformation/brands/phtm/template.yml +1 -102
- gbdtransformation/brands/qatm/__init__.py +5 -0
- gbdtransformation/brands/qatm/filters.py +81 -0
- gbdtransformation/brands/qatm/schema +87 -0
- gbdtransformation/brands/qatm/template.yml +1 -0
- gbdtransformation/brands/qatm/tests/__init__.py +0 -0
- gbdtransformation/brands/sgtm/filters.py +1 -0
- gbdtransformation/brands/sgtm/template.trademark.yml +2 -2
- gbdtransformation/brands/ustm/template.yml +1 -1
- gbdtransformation/brands/vctm/__init__.py +5 -0
- gbdtransformation/brands/vctm/filters.py +75 -0
- gbdtransformation/brands/vctm/schema +87 -0
- gbdtransformation/brands/vctm/template.yml +1 -0
- gbdtransformation/brands/vctm/tests/__init__.py +0 -0
- gbdtransformation/brands/vntm/filters.py +1 -3
- gbdtransformation/brands/xxxx/template.yml +1 -1
- gbdtransformation/designs/__init__.py +8 -0
- gbdtransformation/designs/alid/__init__.py +1 -1
- gbdtransformation/designs/alid/filters.py +14 -1
- gbdtransformation/designs/bnid/__init__.py +5 -0
- gbdtransformation/designs/bnid/filters.py +61 -0
- gbdtransformation/designs/bnid/schema +80 -0
- gbdtransformation/designs/bnid/template.yml +1 -0
- gbdtransformation/designs/bwid/__init__.py +6 -0
- gbdtransformation/designs/bwid/filters.py +64 -0
- gbdtransformation/designs/bwid/schema +101 -0
- gbdtransformation/designs/bwid/template.yml +1 -0
- gbdtransformation/designs/crid/__init__.py +5 -0
- gbdtransformation/designs/crid/filters.py +63 -0
- gbdtransformation/designs/crid/schema +94 -0
- gbdtransformation/designs/crid/template.yml +1 -0
- gbdtransformation/designs/cuid/__init__.py +5 -0
- gbdtransformation/designs/cuid/filters.py +60 -0
- gbdtransformation/designs/cuid/schema +98 -0
- gbdtransformation/designs/cuid/template.yml +1 -0
- gbdtransformation/designs/egid/__init__.py +5 -0
- gbdtransformation/designs/egid/filters.py +62 -0
- gbdtransformation/designs/egid/schema +82 -0
- gbdtransformation/designs/egid/template.yml +1 -0
- gbdtransformation/designs/filters.py +73 -0
- gbdtransformation/designs/idid/__init__.py +5 -0
- gbdtransformation/designs/idid/filters.py +67 -0
- gbdtransformation/designs/idid/schema +102 -0
- gbdtransformation/designs/idid/template.yml +1 -0
- gbdtransformation/designs/ipas/filters.py +84 -2
- gbdtransformation/designs/ipas/template.yml +90 -79
- gbdtransformation/designs/joid/__init__.py +6 -0
- gbdtransformation/designs/joid/filters.py +62 -0
- gbdtransformation/designs/joid/schema +97 -0
- gbdtransformation/designs/joid/template.yml +1 -0
- gbdtransformation/designs/keid/__init__.py +5 -0
- gbdtransformation/designs/keid/filters.py +62 -0
- gbdtransformation/designs/keid/schema +99 -0
- gbdtransformation/designs/keid/template.yml +1 -0
- gbdtransformation/designs/khid/__init__.py +5 -0
- gbdtransformation/designs/khid/filters.py +63 -0
- gbdtransformation/designs/khid/schema +100 -0
- gbdtransformation/designs/khid/template.yml +1 -0
- gbdtransformation/designs/laid/__init__.py +5 -0
- gbdtransformation/designs/laid/filters.py +61 -0
- gbdtransformation/designs/laid/schema +94 -0
- gbdtransformation/designs/laid/template.yml +1 -0
- gbdtransformation/designs/mnid/__init__.py +6 -0
- gbdtransformation/designs/mnid/filters.py +62 -0
- gbdtransformation/designs/mnid/schema +98 -0
- gbdtransformation/designs/mnid/template.yml +1 -0
- gbdtransformation/designs/myid/__init__.py +5 -0
- gbdtransformation/designs/myid/filters.py +60 -0
- gbdtransformation/designs/myid/schema +95 -0
- gbdtransformation/designs/myid/template.yml +1 -0
- gbdtransformation/designs/phid/__init__.py +5 -0
- gbdtransformation/designs/phid/filters.py +70 -0
- gbdtransformation/designs/phid/schema +95 -0
- gbdtransformation/designs/phid/template.yml +1 -0
- gbdtransformation/designs/sgid/__init__.py +6 -0
- gbdtransformation/designs/sgid/filters.py +66 -0
- gbdtransformation/designs/sgid/schema +115 -0
- gbdtransformation/designs/sgid/template.yml +1 -0
- gbdtransformation/designs/thid/__init__.py +4 -0
- gbdtransformation/designs/thid/filters.py +64 -0
- gbdtransformation/designs/thid/schema +98 -0
- gbdtransformation/designs/thid/template.yml +1 -0
- gbdtransformation/designs/tnid/__init__.py +5 -0
- gbdtransformation/designs/tnid/filters.py +66 -0
- gbdtransformation/designs/tnid/schema +96 -0
- gbdtransformation/designs/tnid/template.yml +1 -0
- gbdtransformation/designs/vnid/__init__.py +5 -0
- gbdtransformation/designs/vnid/filters.py +62 -0
- gbdtransformation/designs/vnid/schema +97 -0
- gbdtransformation/designs/vnid/template.yml +1 -0
- gbdtransformation/designs/woid/__init__.py +2 -0
- gbdtransformation/designs/woid/filters.py +372 -0
- gbdtransformation/designs/woid/schema +592 -0
- gbdtransformation/designs/woid/template.yml +516 -0
- gbdtransformation/designs/xxid/template.yml +331 -119
- gbdtransformation/execs-nico.py +709 -0
- gbdtransformation/execs.py +55 -4
- gbdtransformation/gbd-transform.exec.tgz +0 -0
- {wipo_gbd_transformation-1.1.46.dist-info → wipo_gbd_transformation-1.1.59.dist-info}/METADATA +4 -1
- {wipo_gbd_transformation-1.1.46.dist-info → wipo_gbd_transformation-1.1.59.dist-info}/RECORD +139 -39
- wipo_gbd_transformation-1.1.59.dist-info/SOURCES_Stefans-Mac-Studio.local_Sep-18-063455-2024_Conflict.txt +690 -0
- {wipo_gbd_transformation-1.1.46.dist-info → wipo_gbd_transformation-1.1.59.dist-info}/entry_points.txt +1 -0
- {wipo_gbd_transformation-1.1.46.dist-info → wipo_gbd_transformation-1.1.59.dist-info}/LICENSE.md +0 -0
- {wipo_gbd_transformation-1.1.46.dist-info → wipo_gbd_transformation-1.1.59.dist-info}/WHEEL +0 -0
- {wipo_gbd_transformation-1.1.46.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,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
|
|
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
|
|