def update_local_issue(
gr_issue,
id_namespace='',
service_namespace='',
):
"""
:param gr_issue: GeoReportv2 Issue structure (as a dict)
:param id_namespace: String to prepend to request identifiers
:param service_namespace: String to prepend to service codes
:return: The created/updated Issue and a `created` flag
"""
gr_issue = deepcopy(gr_issue)
identifier = gr_issue.pop('service_request_id')
if id_namespace:
identifier = '%s:%s' % (id_namespace, identifier)
issue = Issue.objects.filter(identifier=identifier).first()
if not issue:
issue = Issue(identifier=identifier)
created = True
else:
created = False
for field in Issue._meta.get_fields():
if field.name in gr_issue:
value = gr_issue.pop(field.name)
if isinstance(field, DateTimeField):
value = parse_date(value)
setattr(issue, field.attname, value)
if "long" in gr_issue and "lat" in gr_issue:
issue.location = GEOSGeometry(
'SRID=4326;POINT(%s %s)' % (gr_issue.pop('long'), gr_issue.pop('lat'))
)
if 'service_code' in gr_issue:
gr_issue['service_code'] = '%s%s' % (service_namespace, gr_issue['service_code'])
# This has no direct mapping in our schema, but it can be used by implicit autocreation of services
issue.service_name = gr_issue.pop('service_name', None)
issue._cache_data()
issue.full_clean()
issue.save()
extended_attributes = gr_issue.pop('extended_attributes', {})
for ex_class in get_extensions():
ex = ex_class()
ex.parse_extended_attributes(issue, extended_attributes)
if gr_issue:
print(gr_issue)
issue.source = gr_issue
return (issue, created)
评论列表
文章目录