示例#1
0
def report(request, resourceid):
    lang = request.GET.get('lang', settings.LANGUAGE_CODE)
    se = SearchEngineFactory().create()
    report_info = se.search(index='resource', id=resourceid)
    report_info['source'] = report_info['_source']
    report_info['type'] = report_info['_type']
    report_info['source']['graph'] = report_info['source']['graph']
    del report_info['_source']
    del report_info['_type']

    def get_evaluation_path(valueid):
        value = models.Values.objects.get(pk=valueid)
        concept_graph = Concept().get(id=value.conceptid_id, include_subconcepts=False, 
            include_parentconcepts=True, include_relatedconcepts=False, up_depth_limit=None, lang=lang)
        
        paths = []
        for path in concept_graph.get_paths(lang=lang)[0]:
            if path['label'] != 'Arches' and path['label'] != 'Evaluation Criteria Type':
                paths.append(path['label'])
        return '; '.join(paths)


    concept_label_ids = set()
    uuid_regex = re.compile('[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}')
    # gather together all uuid's referenced in the resource graph
    def crawl(items):
        for item in items:
            for key in item:
                if isinstance(item[key], list):
                    crawl(item[key])
                else:
                    if isinstance(item[key], basestring) and uuid_regex.match(item[key]):
                        if key == 'EVALUATION_CRITERIA_TYPE_E55__value':
                            item[key] = get_evaluation_path(item[key])
                        concept_label_ids.add(item[key])

    crawl([report_info['source']['graph']])

    # get all the concept labels from the uuid's
    concept_labels = se.search(index='concept_labels', id=list(concept_label_ids))

    # convert all labels to their localized prefLabel
    temp = {}
    if concept_labels != None:
        for concept_label in concept_labels['docs']:
            #temp[concept_label['_id']] = concept_label
            if concept_label['found']:
                # the resource graph already referenced the preferred label in the desired language
                if concept_label['_source']['type'] == 'prefLabel' and concept_label['_source']['language'] == lang:
                    temp[concept_label['_id']] = concept_label['_source']
                else: 
                    # the resource graph referenced a non-preferred label or a label not in our target language, so we need to get the right label
                    temp[concept_label['_id']] = get_preflabel_from_conceptid(concept_label['_source']['conceptid'], lang)

    # replace the uuid's in the resource graph with their preferred and localized label                    
    def crawl_again(items):
        for item in items:
            for key in item:
                if isinstance(item[key], list):
                    crawl_again(item[key])
                else:
                    if isinstance(item[key], basestring) and uuid_regex.match(item[key]):
                        try:
                            item[key] = temp[item[key]]['value']
                        except:
                            pass

    crawl_again([report_info['source']['graph']])

    #return JSONResponse(report_info, indent=4)

    related_resource_dict = {
        'HERITAGE_RESOURCE': [],
        'HERITAGE_RESOURCE_GROUP': [],
        'ACTIVITY': [],
        'ACTOR': [],
        'HISTORICAL_EVENT': [],
        'INFORMATION_RESOURCE_IMAGE': [],
        'INFORMATION_RESOURCE_DOCUMENT': []
    }

    related_resource_info = get_related_resources(resourceid, lang)

    # parse the related entities into a dictionary by resource type
    for related_resource in related_resource_info['related_resources']:
        information_resource_type = 'DOCUMENT'
        related_resource['relationship'] = []
        if related_resource['entitytypeid'] == 'HERITAGE_RESOURCE.E18':
            for entity in related_resource['domains']:
                if entity['entitytypeid'] == 'RESOURCE_TYPE_CLASSIFICATION.E55':
                    related_resource['relationship'].append(get_preflabel_from_valueid(entity['value'], lang)['value'])
        elif related_resource['entitytypeid'] == 'HERITAGE_RESOURCE_GROUP.E27':
            for entity in related_resource['domains']:
                if entity['entitytypeid'] == 'RESOURCE_TYPE_CLASSIFICATION.E55':
                    related_resource['relationship'].append(get_preflabel_from_valueid(entity['value'], lang)['value'])
        elif related_resource['entitytypeid'] == 'ACTIVITY.E7':
            for entity in related_resource['domains']:
                if entity['entitytypeid'] == 'ACTIVITY_TYPE.E55':
                    related_resource['relationship'].append(get_preflabel_from_valueid(entity['value'], lang)['value'])
        elif related_resource['entitytypeid'] == 'ACTOR.E39':
            for entity in related_resource['domains']:
                if entity['entitytypeid'] == 'ACTOR_TYPE.E55':
                    related_resource['relationship'].append(get_preflabel_from_conceptid(entity['conceptid'], lang)['value'])
                    related_resource['actor_relationshiptype'] = ''
        elif related_resource['entitytypeid'] == 'HISTORICAL_EVENT.E5':
            for entity in related_resource['domains']:
                if entity['entitytypeid'] == 'HISTORICAL_EVENT_TYPE.E55':
                    related_resource['relationship'].append(get_preflabel_from_conceptid(entity['conceptid'], lang)['value'])
        elif related_resource['entitytypeid'] == 'INFORMATION_RESOURCE.E73':
            for entity in related_resource['domains']:
                if entity['entitytypeid'] == 'INFORMATION_RESOURCE_TYPE.E55':
                    related_resource['relationship'].append(get_preflabel_from_valueid(entity['value'], lang)['value'])
            for entity in related_resource['child_entities']:
                if entity['entitytypeid'] == 'FILE_PATH.E62':
                    related_resource['file_path'] = settings.MEDIA_URL + entity['label']
                if entity['entitytypeid'] == 'THUMBNAIL.E62':
                    related_resource['thumbnail'] = settings.MEDIA_URL + entity['label']
                    information_resource_type = 'IMAGE'
            
        # get the relationship between the two entities
        for relationship in related_resource_info['resource_relationships']:
            if relationship['entityid1'] == related_resource['entityid'] or relationship['entityid2'] == related_resource['entityid']: 
                related_resource['relationship'].append(get_preflabel_from_valueid(relationship['relationshiptype'], lang)['value'])

        entitytypeidkey = related_resource['entitytypeid'].split('.')[0]
        if entitytypeidkey == 'INFORMATION_RESOURCE':
            entitytypeidkey = '%s_%s' % (entitytypeidkey, information_resource_type)
        related_resource_dict[entitytypeidkey].append(related_resource)

    # To hide Related Resource block in report page if no related resources present
    no_related_resources = False
    if all(len(value) == 0 for value in related_resource_dict.values()):
        no_related_resources = True

    return render_to_response('resource-report.htm', {
            'geometry': JSONSerializer().serialize(report_info['source']['geometry']),
            'resourceid': resourceid,
            'report_template': 'views/reports/' + report_info['type'] + '.htm',
            'report_info': report_info,
            'related_resource_dict': related_resource_dict,
            'no_related_resources': no_related_resources,
            'main_script': 'resource-report',
            'active_page': 'ResourceReport'
        },
        context_instance=RequestContext(request))        
示例#2
0
    def post(self, request):
        showform = True
        confirmation_message = ""
        postdata = request.POST.copy()
        postdata["ts"] = int(time.time())
        form = ArchesUserCreationForm(postdata,
                                      enable_captcha=settings.ENABLE_CAPTCHA)

        if form.is_valid():
            AES = AESCipher(settings.SECRET_KEY)
            userinfo = JSONSerializer().serialize(form.cleaned_data)
            encrypted_userinfo = AES.encrypt(userinfo)
            url_encrypted_userinfo = urlencode({"link": encrypted_userinfo})

            admin_email = settings.ADMINS[0][1] if settings.ADMINS else ""
            email_context = {
                "button_text":
                _("Signup for Arches"),
                "link":
                request.build_absolute_uri(
                    reverse("confirm_signup") + "?" + url_encrypted_userinfo),
                "greeting":
                _("Thanks for your interest in Arches. Click on link below \
                    to confirm your email address! Use your email address to login."
                  ),
                "closing":
                _("This link expires in 24 hours.  If you can't get to it before then, \
                    don't worry, you can always try again with the same email address."
                  ),
            }

            html_content = render_to_string("email/general_notification.htm",
                                            email_context)  # ...
            text_content = strip_tags(
                html_content
            )  # this strips the html, so people will have the text as well.

            # create the email, and attach the HTML version as well.
            msg = EmailMultiAlternatives(_("Welcome to Arches!"), text_content,
                                         admin_email,
                                         [form.cleaned_data["email"]])
            msg.attach_alternative(html_content, "text/html")
            msg.send()

            confirmation_message = _(
                "An email has been sent to <br><strong>%s</strong><br> with a link to activate your account"
                % form.cleaned_data["email"])
            showform = False

        return render(
            request,
            "signup.htm",
            {
                "enable_captcha": settings.ENABLE_CAPTCHA,
                "form": form,
                "postdata": postdata,
                "showform": showform,
                "confirmation_message": confirmation_message,
                "validation_help": validation.password_validators_help_texts(),
            },
        )
示例#3
0
    def get(self, request, resourceid=None, view_template="views/resource/edit-log.htm"):
        if resourceid is None:
            recent_edits = (
                models.EditLog.objects.all()
                .exclude(resourceclassid=settings.SYSTEM_SETTINGS_RESOURCE_MODEL_ID)
                .order_by("-timestamp")[:100]
            )
            edited_ids = list({edit.resourceinstanceid for edit in recent_edits})
            resources = Resource.objects.filter(resourceinstanceid__in=edited_ids)
            edit_type_lookup = {
                "create": _("Resource Created"),
                "delete": _("Resource Deleted"),
                "tile delete": _("Tile Deleted"),
                "tile create": _("Tile Created"),
                "tile edit": _("Tile Updated"),
                "delete edit": _("Edit Deleted"),
                "bulk_create": _("Resource Created"),
            }
            deleted_instances = [e.resourceinstanceid for e in recent_edits if e.edittype == "delete"]
            graph_name_lookup = {str(r.resourceinstanceid): r.graph.name for r in resources}
            for edit in recent_edits:
                edit.friendly_edittype = edit_type_lookup[edit.edittype]
                edit.resource_model_name = None
                edit.deleted = edit.resourceinstanceid in deleted_instances
                if edit.resourceinstanceid in graph_name_lookup:
                    edit.resource_model_name = graph_name_lookup[edit.resourceinstanceid]
                edit.displayname = edit.note
                if edit.resource_model_name is None:
                    try:
                        edit.resource_model_name = models.GraphModel.objects.get(pk=edit.resourceclassid).name
                    except Exception:
                        pass

            context = self.get_context_data(main_script="views/edit-history", recent_edits=recent_edits)

            context["nav"]["title"] = _("Recent Edits")

            return render(request, "views/edit-history.htm", context)
        else:
            resource_instance = models.ResourceInstance.objects.get(pk=resourceid)
            edits = models.EditLog.objects.filter(resourceinstanceid=resourceid)
            permitted_edits = []
            for edit in edits:
                if edit.nodegroupid is not None:
                    nodegroup = models.NodeGroup.objects.get(pk=edit.nodegroupid)
                    if request.user.has_perm("read_nodegroup", edit.nodegroupid):
                        if edit.newvalue is not None:
                            self.getEditConceptValue(edit.newvalue)
                        if edit.oldvalue is not None:
                            self.getEditConceptValue(edit.oldvalue)
                        permitted_edits.append(edit)
                else:
                    permitted_edits.append(edit)

            resource = Resource.objects.get(pk=resourceid)
            displayname = resource.displayname
            displaydescription = resource.displaydescription
            cards = Card.objects.filter(nodegroup__parentnodegroup=None, graph=resource_instance.graph)
            graph_name = resource_instance.graph.name
            if displayname == "undefined":
                displayname = _("Unnamed Resource")

            context = self.get_context_data(
                main_script="views/resource/edit-log",
                cards=JSONSerializer().serialize(cards),
                resource_type=graph_name,
                resource_description=displaydescription,
                iconclass=resource_instance.graph.iconclass,
                edits=JSONSerializer().serialize(permitted_edits),
                resourceid=resourceid,
                displayname=displayname,
            )

            context["nav"]["res_edit"] = True
            context["nav"]["icon"] = resource_instance.graph.iconclass
            context["nav"]["title"] = graph_name

            return render(request, view_template, context)

        return HttpResponseNotFound()
示例#4
0
    def get(self, request):

        def get_last_login(date):
            result = _("Not yet logged in")
            try:
                if date is not None:
                    result = datetime.strftime(date, '%Y-%m-%d %H:%M')
            except TypeError as e:
                print e
            return result

        identities = []
        for group in Group.objects.all():
            users = group.user_set.all()
            if len(users) > 0:
                groupUsers = [{'id': user.id, 'first_name': user.first_name, 'last_name': user.last_name, 'email': user.email, 'last_login': get_last_login(user.last_login), 'username': user.username, 'groups': [g.id for g in user.groups.all()], 'group_names': ', '.join([g.name for g in user.groups.all()]) } for user in users]
            identities.append({'name': group.name, 'type': 'group', 'id': group.pk, 'users': groupUsers, 'default_permissions': group.permissions.all()})
        for user in User.objects.filter():
            groups = []
            group_ids = []
            default_perms = []
            for group in user.groups.all():
                groups.append(group.name)
                group_ids.append(group.id)
                default_perms = default_perms + list(group.permissions.all())
            identities.append({'name': user.email or user.username, 'groups': ', '.join(groups), 'type': 'user', 'id': user.pk, 'default_permissions': set(default_perms), 'is_superuser':user.is_superuser, 'group_ids': group_ids, 'first_name': user.first_name, 'last_name': user.last_name, 'email': user.email})

        map_layers = models.MapLayer.objects.all()
        map_markers = models.MapMarker.objects.all()
        map_sources = models.MapSource.objects.all()
        geocoding_providers = models.Geocoder.objects.all()

        mobile_survey_models = models.MobileSurveyModel.objects.order_by('name')
        mobile_surveys, resources = self.get_survey_resources(mobile_survey_models)

        for mobile_survey in mobile_surveys:
            try:
                mobile_survey['datadownloadconfig'] = json.loads(mobile_survey['datadownloadconfig'])
            except TypeError:
                pass
            multipart = mobile_survey['bounds']
            singlepart = GeoUtils().convert_multipart_to_singlepart(multipart)
            mobile_survey['bounds'] = singlepart

        serializer = JSONSerializer()
        context = self.get_context_data(
            map_layers=map_layers,
            map_markers=map_markers,
            map_sources=map_sources,
            geocoding_providers=geocoding_providers,
            mobile_surveys=serializer.serialize(mobile_surveys, sort_keys=False),
            identities=serializer.serialize(identities, sort_keys=False),
            resources=serializer.serialize(resources, sort_keys=False),
            resource_download_limit=settings.MOBILE_DOWNLOAD_RESOURCE_LIMIT,
            main_script='views/mobile-survey-manager',
        )

        context['nav']['title'] = _('Mobile Survey Manager')
        context['nav']['icon'] = 'fa-server'
        context['nav']['help'] = {
            'title': _('Mobile Survey Manager'),
            'template': 'mobile-survey-manager-help',
        }

        return render(request, 'views/mobile-survey-manager.htm', context)
示例#5
0
    def toJSON(self):
        from arches.app.utils.betterJSONSerializer import JSONSerializer, JSONDeserializer

        return JSONSerializer().serialize(self)
示例#6
0
文件: graph.py 项目: wangsr729/arches
    def get(self, request, cardid):
        try:
            card = Card.objects.get(cardid=cardid)
            self.graph = Graph.objects.get(graphid=card.graph_id)
        except (Card.DoesNotExist):
            # assume the cardid is actually a graph id
            card = Card.objects.get(cardid=Graph.objects.get(graphid=cardid).get_root_card().cardid)
            self.graph = Graph.objects.get(graphid=card.graph_id)
            if self.graph.isresource is True:
                return redirect("card_manager", graphid=cardid)

        card.confirm_enabled_state(request.user, card.nodegroup)
        for c in card.cards:
            c.confirm_enabled_state(request.user, c.nodegroup)

        datatypes = models.DDataType.objects.all()
        widgets = models.Widget.objects.all()
        geocoding_providers = models.Geocoder.objects.all()
        map_layers = models.MapLayer.objects.all()
        map_markers = models.MapMarker.objects.all()
        map_sources = models.MapSource.objects.all()
        resource_graphs = (
            Graph.objects.exclude(pk=card.graph_id)
            .exclude(pk=settings.SYSTEM_SETTINGS_RESOURCE_MODEL_ID)
            .exclude(isresource=False)
            .exclude(isactive=False)
        )
        lang = request.GET.get("lang", settings.LANGUAGE_CODE)
        concept_collections = Concept().concept_tree(mode="collections", lang=lang)
        ontology_properties = []
        card_root_node = models.Node.objects.get(nodeid=card.nodegroup_id)
        for item in self.graph.get_valid_ontology_classes(nodeid=card.nodegroup_id):
            if card_root_node.ontologyclass in item["ontology_classes"]:
                ontology_properties.append(item["ontology_property"])
        ontology_properties = sorted(ontology_properties, key=lambda item: item)

        context = self.get_context_data(
            main_script="views/graph/card-configuration-manager",
            graph_id=self.graph.graphid,
            card=JSONSerializer().serialize(card),
            datatypes_json=JSONSerializer().serialize(datatypes),
            geocoding_providers=geocoding_providers,
            datatypes=datatypes,
            widgets=widgets,
            widgets_json=JSONSerializer().serialize(widgets),
            map_layers=map_layers,
            map_markers=map_markers,
            map_sources=map_sources,
            resource_graphs=resource_graphs,
            concept_collections=concept_collections,
            ontology_properties=JSONSerializer().serialize(ontology_properties),
        )

        context["graphid"] = self.graph.graphid
        context["graph"] = JSONSerializer().serializeToPython(self.graph)
        context["graph_json"] = json.dumps(context["graph"])
        context["root_node"] = self.graph.node_set.get(istopnode=True)

        context["nav"]["title"] = self.graph.name
        context["nav"]["menu"] = True
        context["nav"]["help"] = {"title": _("Configuring Cards and Widgets"), "template": "card-designer-help"}

        return render(request, "views/graph/card-configuration-manager.htm", context)
示例#7
0
	def write_to_file(self, data, data_dir):
		data['metadata'] = self.export_metadata

		with open(os.path.join(data_dir), 'w') as export_json:
			json.dump(JSONDeserializer().deserialize(JSONSerializer().serialize(data)), export_json, sort_keys=True, indent=4)
示例#8
0
    def get(self, request):
        se = SearchEngineFactory().create()
        datatype_factory = DataTypeFactory()
        datatypes = models.DDataType.objects.all()
        widgets = models.Widget.objects.all()
        map_layers = models.MapLayer.objects.all()
        map_markers = models.MapMarker.objects.all()
        map_sources = models.MapSource.objects.all()
        icons = models.Icon.objects.order_by('name')
        context = self.get_context_data(
            icons=JSONSerializer().serialize(icons),
            datatypes=datatypes,
            widgets=widgets,
            map_layers=map_layers,
            map_markers=map_markers,
            map_sources=map_sources,
            datatypes_json=JSONSerializer().serialize(datatypes),
            main_script='views/map-layer-manager',
        )

        def get_resource_bounds(node):
            query = Query(se, start=0, limit=0)
            search_query = Bool()
            query.add_query(search_query)
            query.add_aggregation(
                GeoBoundsAgg(field='points.point', name='bounds'))
            query.add_query(
                Term(field='graph_id', term=str(node.graph.graphid)))
            results = query.search(index='resources')
            bounds = results['aggregations']['bounds'][
                'bounds'] if 'bounds' in results['aggregations'][
                    'bounds'] else None
            return bounds

        context['geom_nodes_json'] = JSONSerializer().serialize(
            context['geom_nodes'])
        resource_layers = []
        resource_sources = []
        permissions = {}
        for node in context['geom_nodes']:
            datatype = datatype_factory.get_instance(node.datatype)
            map_layer = datatype.get_map_layer(node=node, preview=True)
            if map_layer is not None:
                count = models.TileModel.objects.filter(
                    data__has_key=str(node.nodeid)).count()
                if count > 0:
                    map_layer['bounds'] = get_resource_bounds(node)
                else:
                    map_layer['bounds'] = None
                resource_layers.append(map_layer)
            map_source = datatype.get_map_source(node=node, preview=True)
            if map_source is not None:
                resource_sources.append(map_source)
            permissions[str(node.pk)] = {
                "users":
                sorted([
                    user.email
                    or user.username for user in get_users_for_object(
                        'read_nodegroup', node.nodegroup)
                ]),
                "groups":
                sorted([
                    group.name for group in get_groups_for_object(
                        'read_nodegroup', node.nodegroup)
                ])
            }
        context['resource_map_layers_json'] = JSONSerializer().serialize(
            resource_layers)
        context['resource_map_sources_json'] = JSONSerializer().serialize(
            resource_sources)
        context['node_permissions'] = JSONSerializer().serialize(permissions)

        context['nav']['title'] = _('Map Layer Manager')
        context['nav']['icon'] = 'fa-server'
        context['nav']['help'] = {
            'title': _('Map Layer Manager'),
            'template': 'map-manager-help',
        }

        return render(request, 'views/map-layer-manager.htm', context)
示例#9
0
文件: resource.py 项目: nyanev/arches
    def get(self, request, resourceid=None):
        lang = request.GET.get("lang", settings.LANGUAGE_CODE)
        resource = Resource.objects.get(pk=resourceid)
        displayname = resource.displayname
        resource_models = (
            models.GraphModel.objects.filter(isresource=True).exclude(isactive=False).exclude(pk=settings.SYSTEM_SETTINGS_RESOURCE_MODEL_ID)
        )
        related_resource_summary = [{"graphid": str(g.graphid), "name": g.name, "resources": []} for g in resource_models]
        related_resources_search_results = resource.get_related_resources(lang=lang, start=0, limit=1000)
        related_resources = related_resources_search_results["related_resources"]
        relationships = related_resources_search_results["resource_relationships"]
        resource_relationship_type_values = {i["id"]: i["text"] for i in get_resource_relationship_types()["values"]}

        for rr in related_resources:
            for summary in related_resource_summary:
                if rr["graph_id"] == summary["graphid"]:
                    relationship_summary = []
                    for relationship in relationships:
                        if rr["resourceinstanceid"] in (relationship["resourceinstanceidto"], relationship["resourceinstanceidfrom"]):
                            rr_type = (
                                resource_relationship_type_values[relationship["relationshiptype"]]
                                if relationship["relationshiptype"] in resource_relationship_type_values
                                else relationship["relationshiptype"]
                            )
                            relationship_summary.append(rr_type)
                    summary["resources"].append(
                        {"instance_id": rr["resourceinstanceid"], "displayname": rr["displayname"], "relationships": relationship_summary}
                    )

        tiles = Tile.objects.filter(resourceinstance=resource).order_by("sortorder")

        permitted_tiles = []

        perm = "read_nodegroup"

        for tile in tiles:
            if request.user.has_perm(perm, tile.nodegroup):
                tile.filter_by_perm(request.user, perm)
                permitted_tiles.append(tile)

        if request.GET.get("json", False) and request.GET.get("exclude_graph", False):
            return JSONResponse(
                {
                    "tiles": permitted_tiles,
                    "related_resources": related_resource_summary,
                    "displayname": displayname,
                    "resourceid": resourceid,
                }
            )

        datatypes = models.DDataType.objects.all()
        graph = Graph.objects.get(graphid=resource.graph_id)
        cards = Card.objects.filter(graph_id=resource.graph_id).order_by("sortorder")
        permitted_cards = []
        for card in cards:
            if request.user.has_perm(perm, card.nodegroup):
                card.filter_by_perm(request.user, perm)
                permitted_cards.append(card)
        cardwidgets = [
            widget for widgets in [card.cardxnodexwidget_set.order_by("sortorder").all() for card in permitted_cards] for widget in widgets
        ]

        if request.GET.get("json", False) and not request.GET.get("exclude_graph", False):
            return JSONResponse(
                {
                    "datatypes": datatypes,
                    "cards": permitted_cards,
                    "tiles": permitted_tiles,
                    "graph": graph,
                    "related_resources": related_resource_summary,
                    "displayname": displayname,
                    "resourceid": resourceid,
                    "cardwidgets": cardwidgets,
                }
            )

        widgets = models.Widget.objects.all()
        templates = models.ReportTemplate.objects.all()
        card_components = models.CardComponent.objects.all()
        try:
            map_layers = models.MapLayer.objects.all()
            map_markers = models.MapMarker.objects.all()
            map_sources = models.MapSource.objects.all()
            geocoding_providers = models.Geocoder.objects.all()
        except AttributeError:
            raise Http404(_("No active report template is available for this resource."))

        context = self.get_context_data(
            main_script="views/resource/report",
            report_templates=templates,
            templates_json=JSONSerializer().serialize(templates, sort_keys=False, exclude=["name", "description"]),
            card_components=card_components,
            card_components_json=JSONSerializer().serialize(card_components),
            cardwidgets=JSONSerializer().serialize(cardwidgets),
            tiles=JSONSerializer().serialize(permitted_tiles, sort_keys=False),
            cards=JSONSerializer().serialize(
                permitted_cards,
                sort_keys=False,
                exclude=["is_editable", "description", "instructions", "helpenabled", "helptext", "helptitle", "ontologyproperty"],
            ),
            datatypes_json=JSONSerializer().serialize(
                datatypes, exclude=["modulename", "issearchable", "configcomponent", "configname", "iconclass"]
            ),
            geocoding_providers=geocoding_providers,
            related_resources=JSONSerializer().serialize(related_resource_summary, sort_keys=False),
            widgets=widgets,
            map_layers=map_layers,
            map_markers=map_markers,
            map_sources=map_sources,
            graph_id=graph.graphid,
            graph_name=graph.name,
            graph_json=JSONSerializer().serialize(
                graph,
                sort_keys=False,
                exclude=[
                    "functions",
                    "relatable_resource_model_ids",
                    "domain_connections",
                    "edges",
                    "is_editable",
                    "description",
                    "iconclass",
                    "subtitle",
                    "author",
                ],
            ),
            resourceid=resourceid,
            displayname=displayname,
        )

        if graph.iconclass:
            context["nav"]["icon"] = graph.iconclass
        context["nav"]["title"] = graph.name
        context["nav"]["res_edit"] = True
        context["nav"]["print"] = True
        context["nav"]["print"] = True

        return render(request, "views/resource/report.htm", context)
示例#10
0
 def to_json(self):
     return JSONSerializer().serialize(self)
示例#11
0
    def get_e55_domain(self, entitytypeid):
        """
        For a given entitytypeid creates a dictionary representing that entitytypeid's concept graph (member pathway) formatted to support
        select2 dropdowns

        """
        cursor = connection.cursor()

        entitytype = models.EntityTypes.objects.get(pk=entitytypeid)

        sql = """
        WITH RECURSIVE children AS (
            SELECT d.conceptidfrom, d.conceptidto, c2.value, c2.valueid as valueid, c.value as valueto, c.valueid as valueidto, c.valuetype as vtype, 1 AS depth, array[d.conceptidto] AS conceptpath, array[c.valueid] AS idpath        ---|NonRecursive Part
                FROM concepts.relations d
                JOIN concepts.values c ON(c.conceptid = d.conceptidto)
                JOIN concepts.values c2 ON(c2.conceptid = d.conceptidfrom)
                WHERE d.conceptidfrom = '{0}'
                and c2.valuetype = 'prefLabel'
                and c.valuetype in ('prefLabel', 'sortorder', 'collector')
                and (d.relationtype = 'member' or d.relationtype = 'hasTopConcept')
                UNION
                SELECT d.conceptidfrom, d.conceptidto, v2.value, v2.valueid as valueid, v.value as valueto, v.valueid as valueidto, v.valuetype as vtype, depth+1, (conceptpath || d.conceptidto), (idpath || v.valueid)   ---|RecursivePart
                FROM concepts.relations  d
                JOIN children b ON(b.conceptidto = d.conceptidfrom)
                JOIN concepts.values v ON(v.conceptid = d.conceptidto)
                JOIN concepts.values v2 ON(v2.conceptid = d.conceptidfrom)
                WHERE  v2.valuetype = 'prefLabel'
                and v.valuetype in ('prefLabel','sortorder', 'collector')
                and (d.relationtype = 'member' or d.relationtype = 'hasTopConcept')
            ) SELECT conceptidfrom::text, conceptidto::text, value, valueid::text, valueto, valueidto::text, depth, idpath::text, conceptpath::text, vtype FROM children ORDER BY depth, conceptpath;
        """.format(entitytype.conceptid_id)

        column_names = [
            'conceptidfrom', 'conceptidto', 'value', 'valueid', 'valueto',
            'valueidto', 'depth', 'idpath', 'conceptpath', 'vtype'
        ]
        cursor.execute(sql)
        rows = cursor.fetchall()

        class Val(object):
            def __init__(self, conceptid):
                self.text = ''
                self.conceptid = conceptid
                self.id = ''
                self.sortorder = ''
                self.collector = ''
                self.children = []
                self.entitytypeid = entitytypeid

        result = Val(entitytype.conceptid_id)

        def _findNarrower(val, path, rec):
            for conceptid in path:
                childids = [child.conceptid for child in val.children]
                if conceptid not in childids:
                    new_val = Val(rec['conceptidto'])
                    if rec['vtype'] == 'sortorder':
                        new_val.sortorder = rec['valueto']
                    elif rec['vtype'] == 'prefLabel':
                        new_val.text = rec['valueto']
                        new_val.id = rec['valueidto']
                    elif rec['vtype'] == 'collector':
                        new_val.collector = 'collector'
                    val.children.append(new_val)
                else:
                    for child in val.children:
                        if conceptid == child.conceptid:
                            if conceptid == path[-1]:
                                if rec['vtype'] == 'sortorder':
                                    child.sortorder = rec['valueto']
                                elif rec['vtype'] == 'prefLabel':
                                    child.text = rec['valueto']
                                    child.id = rec['valueidto']
                                elif rec['vtype'] == 'collector':
                                    child.collector = 'collector'
                            path.pop(0)
                            _findNarrower(child, path, rec)
                val.children.sort(key=lambda x: (x.sortorder, x.text))

        for row in rows:
            rec = dict(zip(column_names, row))
            path = rec['conceptpath'][1:-1].split(',')
            _findNarrower(result, path, rec)

        return JSONSerializer().serializeToPython(result)['children']
示例#12
0
 def __repr__(self):
     return ('%s: %s of type %s with value %s') % (self.__class__, self.entityid, self.entitytypeid, JSONSerializer().serialize(self.value))
示例#13
0
    def get(self, request, resourceid):
        try:
            resource_instance = Resource.objects.get(pk=resourceid)
            graph = resource_instance.graph
        except Resource.DoesNotExist:
            graph = models.GraphModel.objects.get(pk=resourceid)
            resourceid = None
            resource_instance = None
            pass
        nodes = graph.node_set.all()

        nodegroups = []
        editable_nodegroups = []
        for node in nodes:
            if node.is_collector:
                added = False
                if request.user.has_perm("write_nodegroup", node.nodegroup):
                    editable_nodegroups.append(node.nodegroup)
                    nodegroups.append(node.nodegroup)
                    added = True
                if not added and request.user.has_perm("read_nodegroup",
                                                       node.nodegroup):
                    nodegroups.append(node.nodegroup)

        nodes = nodes.filter(nodegroup__in=nodegroups)
        cards = graph.cardmodel_set.order_by("sortorder").filter(
            nodegroup__in=nodegroups).prefetch_related("cardxnodexwidget_set")
        cardwidgets = [
            widget for widgets in [
                card.cardxnodexwidget_set.order_by("sortorder").all()
                for card in cards
            ] for widget in widgets
        ]
        datatypes = models.DDataType.objects.all()
        user_is_reviewer = request.user.groups.filter(
            name="Resource Reviewer").exists()
        widgets = models.Widget.objects.all()
        card_components = models.CardComponent.objects.all()

        if resource_instance is None:
            tiles = []
            displayname = _("New Resource")
        else:
            displayname = resource_instance.displayname
            if displayname == "undefined":
                displayname = _("Unnamed Resource")
            if str(resource_instance.graph_id
                   ) == settings.SYSTEM_SETTINGS_RESOURCE_MODEL_ID:
                displayname = _("System Settings")

            tiles = resource_instance.tilemodel_set.order_by(
                "sortorder").filter(nodegroup__in=nodegroups)
            provisionaltiles = []
            for tile in tiles:
                append_tile = True
                isfullyprovisional = False
                if tile.provisionaledits is not None:
                    if len(list(tile.provisionaledits.keys())) > 0:
                        if len(tile.data) == 0:
                            isfullyprovisional = True
                        if user_is_reviewer is False:
                            if str(request.user.id) in tile.provisionaledits:
                                tile.provisionaledits = {
                                    str(request.user.id):
                                    tile.provisionaledits[str(request.user.id)]
                                }
                                tile.data = tile.provisionaledits[str(
                                    request.user.id)]["value"]
                            else:
                                if isfullyprovisional is True:
                                    # if the tile IS fully provisional and the current user is not the owner,
                                    # we don't send that tile back to the client.
                                    append_tile = False
                                else:
                                    # if the tile has authoritaive data and the current user is not the owner,
                                    # we don't send the provisional data of other users back to the client.
                                    tile.provisionaledits = None
                if append_tile is True:
                    provisionaltiles.append(tile)
            tiles = provisionaltiles

        cards = JSONSerializer().serializeToPython(cards)
        editable_nodegroup_ids = [
            str(nodegroup.pk) for nodegroup in editable_nodegroups
        ]
        for card in cards:
            card["is_writable"] = False
            if str(card["nodegroup_id"]) in editable_nodegroup_ids:
                card["is_writable"] = True

        context = {
            "resourceid": resourceid,
            "displayname": displayname,
            "tiles": tiles,
            "cards": cards,
            "nodegroups": nodegroups,
            "nodes": nodes,
            "cardwidgets": cardwidgets,
            "datatypes": datatypes,
            "userisreviewer": user_is_reviewer,
            "widgets": widgets,
            "card_components": card_components,
        }

        return JSONResponse(context, indent=4)
示例#14
0
    def get(
        self,
        request,
        graphid=None,
        resourceid=None,
        view_template="views/resource/editor.htm",
        main_script="views/resource/editor",
        nav_menu=True,
    ):
        if self.action == "copy":
            return self.copy(request, resourceid)

        resource_instance_exists = False

        try:
            resource_instance = Resource.objects.get(pk=resourceid)
            resource_instance_exists = True
            graphid = resource_instance.graph_id

        except ObjectDoesNotExist:
            resource_instance = Resource()
            resource_instance.resourceinstanceid = resourceid
            resource_instance.graph_id = graphid

        if resourceid is not None:
            resource_graphs = (models.GraphModel.objects.exclude(
                pk=settings.SYSTEM_SETTINGS_RESOURCE_MODEL_ID).exclude(
                    isresource=False).exclude(isactive=False))
            graph = Graph.objects.get(graphid=graphid)
            relationship_type_values = get_resource_relationship_types()
            datatypes = models.DDataType.objects.all()
            widgets = models.Widget.objects.all()
            map_layers = models.MapLayer.objects.all()
            map_markers = models.MapMarker.objects.all()
            map_sources = models.MapSource.objects.all()
            geocoding_providers = models.Geocoder.objects.all()
            required_widgets = []

            widget_datatypes = [v.datatype for k, v in graph.nodes.items()]
            widgets = widgets.filter(datatype__in=widget_datatypes)

            if resource_instance_exists == True:
                displayname = Resource.objects.get(pk=resourceid).displayname
                if displayname == "undefined":
                    displayname = "Unnamed Resource"
            else:
                displayname = "Unnamed Resource"

            date_nodes = models.Node.objects.filter(datatype="date",
                                                    graph__isresource=True,
                                                    graph__isactive=True)
            searchable_datatypes = [
                d.pk
                for d in models.DDataType.objects.filter(issearchable=True)
            ]
            searchable_nodes = models.Node.objects.filter(
                graph__isresource=True,
                graph__isactive=True,
                datatype__in=searchable_datatypes,
                issearchable=True)
            resource_cards = models.CardModel.objects.filter(
                graph__isresource=True, graph__isactive=True)
            context = self.get_context_data(
                main_script=main_script,
                resource_type=graph.name,
                relationship_types=relationship_type_values,
                iconclass=graph.iconclass,
                datatypes_json=JSONSerializer().serialize(
                    datatypes,
                    exclude=["iconclass", "modulename", "classname"]),
                datatypes=datatypes,
                widgets=widgets,
                date_nodes=date_nodes,
                map_layers=map_layers,
                map_markers=map_markers,
                map_sources=map_sources,
                geocoding_providers=geocoding_providers,
                widgets_json=JSONSerializer().serialize(widgets),
                resourceid=resourceid,
                resource_graphs=resource_graphs,
                graph_json=JSONSerializer().serialize(
                    graph,
                    exclude=[
                        "iconclass",
                        "functions",
                        "functions_x_graphs",
                        "name",
                        "description",
                        "deploymentfile",
                        "author",
                        "deploymentdate",
                        "version",
                        "isresource",
                        "isactive",
                        "iconclass",
                        "ontology",
                    ],
                ),
                displayname=displayname,
                resource_cards=JSONSerializer().serialize(resource_cards,
                                                          exclude=[
                                                              "description",
                                                              "instructions",
                                                              "active",
                                                              "isvisible"
                                                          ]),
                searchable_nodes=JSONSerializer().serialize(
                    searchable_nodes,
                    exclude=[
                        "description", "ontologyclass", "isrequired",
                        "issearchable", "istopnode"
                    ]),
                saved_searches=JSONSerializer().serialize(
                    settings.SAVED_SEARCHES),
                resource_instance_exists=resource_instance_exists,
                user_is_reviewer=json.dumps(
                    request.user.groups.filter(
                        name="Resource Reviewer").exists()),
                userid=request.user.id,
            )

            if graph.iconclass:
                context["nav"]["icon"] = graph.iconclass
            context["nav"]["title"] = graph.name
            context["nav"]["menu"] = nav_menu
            if resourceid == settings.RESOURCE_INSTANCE_ID:
                context["nav"]["help"] = (_("Managing System Settings"),
                                          "help/base-help.htm")
                context["help"] = "system-settings-help"
            else:
                context["nav"]["help"] = (_("Using the Resource Editor"),
                                          "help/base-help.htm")
                context["help"] = "resource-editor-help"

            return render(request, view_template, context)

        return HttpResponseNotFound()
示例#15
0
文件: graph.py 项目: wangsr729/arches
    def get(self, request, graphid):
        self.graph = Graph.objects.get(graphid=graphid)
        ontologies = models.Ontology.objects.filter(parentontology=None)
        ontology_classes = models.OntologyClass.objects.values("source", "ontology_id")
        datatypes = models.DDataType.objects.all()
        datatypes_json = JSONSerializer().serialize(datatypes, exclude=["modulename", "isgeometric"])
        branch_graphs = Graph.objects.exclude(pk=graphid).exclude(isresource=True)
        applied_functions = JSONSerializer().serialize(models.FunctionXGraph.objects.filter(graph=self.graph))
        cards = self.graph.cardmodel_set.order_by("sortorder").prefetch_related("cardxnodexwidget_set")
        constraints = []
        for card in cards:
            if models.ConstraintModel.objects.filter(card=card).count() > 0:
                constraints += models.ConstraintModel.objects.filter(card=card)

        cardwidgets = [
            widget for widgets in [card.cardxnodexwidget_set.order_by("sortorder").all() for card in cards] for widget in widgets
        ]
        widgets = models.Widget.objects.all()
        nodegroups = cards.values_list("nodegroup_id", flat=True)

        if settings.OVERRIDE_RESOURCE_MODEL_LOCK:
            restricted_nodegroups = []
        else:
            restricted_nodegroups = (
                models.TileModel.objects.filter(nodegroup__in=nodegroups).values_list("nodegroup_id", flat=True).distinct()
            )

        card_components = models.CardComponent.objects.all()
        map_layers = models.MapLayer.objects.all()
        map_markers = models.MapMarker.objects.all()
        map_sources = models.MapSource.objects.all()
        templates = models.ReportTemplate.objects.all()
        card_components = models.CardComponent.objects.all()
        geocoding_providers = models.Geocoder.objects.all()
        if self.graph.ontology is not None:
            branch_graphs = branch_graphs.filter(ontology=self.graph.ontology)
        context = self.get_context_data(
            main_script="views/graph-designer",
            datatypes_json=datatypes_json,
            datatypes=datatypes,
            ontology_namespaces=self.get_ontology_namespaces(),
            branches=JSONSerializer().serialize(
                branch_graphs, exclude=["cards", "domain_connections", "functions", "cards", "deploymentfile", "deploymentdate"]
            ),
            branch_list={"title": _("Branch Library"), "search_placeholder": _("Find a graph branch")},
            widgets=widgets,
            widgets_json=JSONSerializer().serialize(widgets),
            card_components=card_components,
            card_components_json=JSONSerializer().serialize(card_components),
            cards=JSONSerializer().serialize(cards),
            cardwidgets=JSONSerializer().serialize(cardwidgets),
            map_layers=map_layers,
            map_markers=map_markers,
            map_sources=map_sources,
            applied_functions=applied_functions,
            geocoding_providers=geocoding_providers,
            report_templates=templates,
            restricted_nodegroups=[str(nodegroup) for nodegroup in restricted_nodegroups],
        )
        context["ontologies"] = JSONSerializer().serialize(ontologies, exclude=["version", "path"])
        context["ontology_classes"] = JSONSerializer().serialize(ontology_classes)
        context["graph"] = JSONSerializer().serialize(
            self.graph, exclude=["functions", "cards", "deploymentfile", "deploymentdate", "_nodegroups_to_delete", "_functions"]
        )
        context["graph_models"] = models.GraphModel.objects.all().exclude(graphid=settings.SYSTEM_SETTINGS_RESOURCE_MODEL_ID)
        context["graphs"] = JSONSerializer().serialize(context["graph_models"], exclude=["functions"])
        context["nav"]["title"] = self.graph.name
        context["nav"]["menu"] = True

        help_title = _("Designing a Resource Model")
        if not self.graph.isresource:
            help_title = _("Designing a Branch")

        context["nav"]["help"] = {"title": help_title, "template": "graph-tab-help"}
        context["constraints"] = JSONSerializer().serialize(constraints)

        return render(request, "views/graph-designer.htm", context)
示例#16
0
    def import_business_data(self, business_data, mapping=None):
        reporter = ResourceImportReporter(business_data)
        try:
            if mapping == None or mapping == '':
                self.import_business_data_without_mapping(
                    business_data, reporter)
            else:
                blanktilecache = {}
                target_nodegroup_cardinalities = {}
                for nodegroup in JSONSerializer().serializeToPython(
                        NodeGroup.objects.all()):
                    target_nodegroup_cardinalities[
                        nodegroup['nodegroupid']] = nodegroup['cardinality']

                for resource in business_data['resources']:
                    reporter.update_tiles(len(resource['tiles']))
                    parenttileids = []
                    populated_tiles = []
                    resourceinstanceid = uuid.uuid4()
                    populated_nodegroups = []

                    target_resource_model = mapping['resource_model_id']

                    for tile in resource['tiles']:
                        if tile['data'] != {}:

                            def get_tiles(tile):
                                if tile['parenttile_id'] != None:
                                    if tile['parenttile_id'] not in parenttileids:
                                        parenttileids.append(
                                            tile['parenttile_id'])
                                        ret = []
                                        for sibling_tile in resource['tiles']:
                                            if sibling_tile[
                                                    'parenttile_id'] == tile[
                                                        'parenttile_id']:
                                                ret.append(sibling_tile)
                                    else:
                                        ret = None
                                else:
                                    ret = [tile]

                                #deletes nodes that don't have values
                                if ret is not None:
                                    for tile in ret:
                                        for key, value in tile[
                                                'data'].iteritems():
                                            if value == "":
                                                del tile['data'][key]
                                return ret

                            tiles = get_tiles(tile)
                            if tiles is not None:
                                mapped_tiles = self.replace_source_nodeid(
                                    tiles, mapping)
                                blank_tile = self.get_blank_tile(
                                    tiles, blanktilecache, tiles,
                                    resourceinstanceid)

                                def populate_tile(sourcetilegroup,
                                                  target_tile):
                                    need_new_tile = False
                                    target_tile_cardinality = target_nodegroup_cardinalities[
                                        str(target_tile.nodegroup_id)]
                                    if str(target_tile.nodegroup_id
                                           ) not in populated_nodegroups:
                                        if target_tile.data != {}:
                                            for source_tile in sourcetilegroup:
                                                for tiledata in source_tile[
                                                        'data']:
                                                    for nodeid in tiledata.keys(
                                                    ):
                                                        if nodeid in target_tile.data:
                                                            if target_tile.data[
                                                                    nodeid] == None:
                                                                target_tile.data[
                                                                    nodeid] = tiledata[
                                                                        nodeid]
                                                                for key in tiledata.keys(
                                                                ):
                                                                    if key == nodeid:
                                                                        del tiledata[
                                                                            nodeid]
                                                for tiledata in source_tile[
                                                        'data']:
                                                    if tiledata == {}:
                                                        source_tile[
                                                            'data'].remove(
                                                                tiledata)

                                        elif target_tile.tiles != None:
                                            populated_child_nodegroups = []
                                            for nodegroupid, childtile in target_tile.tiles.iteritems(
                                            ):
                                                childtile_empty = True
                                                child_tile_cardinality = target_nodegroup_cardinalities[
                                                    str(childtile[0].
                                                        nodegroup_id)]
                                                if str(
                                                        childtile[0].
                                                        nodegroup_id
                                                ) not in populated_child_nodegroups:
                                                    prototype_tile = childtile.pop(
                                                    )
                                                    prototype_tile.tileid = None

                                                    for source_tile in sourcetilegroup:
                                                        if prototype_tile.nodegroup_id not in populated_child_nodegroups:
                                                            prototype_tile_copy = deepcopy(
                                                                prototype_tile)

                                                            for data in source_tile[
                                                                    'data']:
                                                                for nodeid in data.keys(
                                                                ):
                                                                    if nodeid in prototype_tile.data.keys(
                                                                    ):
                                                                        if prototype_tile.data[
                                                                                nodeid] == None:
                                                                            prototype_tile_copy.data[
                                                                                nodeid] = data[
                                                                                    nodeid]
                                                                            for key in data.keys(
                                                                            ):
                                                                                if key == nodeid:
                                                                                    del data[
                                                                                        nodeid]
                                                                            if child_tile_cardinality == '1':
                                                                                populated_child_nodegroups.append(
                                                                                    prototype_tile
                                                                                    .
                                                                                    nodegroup_id
                                                                                )
                                                            for data in source_tile[
                                                                    'data']:
                                                                if data == {}:
                                                                    source_tile[
                                                                        'data'].remove(
                                                                            data
                                                                        )

                                                            for key in prototype_tile_copy.data.keys(
                                                            ):
                                                                if prototype_tile_copy.data[
                                                                        key] != None:
                                                                    childtile_empty = False
                                                            if prototype_tile_copy.data == {} or childtile_empty:
                                                                prototype_tile_copy = None
                                                            if prototype_tile_copy is not None:
                                                                childtile.append(
                                                                    prototype_tile_copy
                                                                )
                                                        else:
                                                            break

                                        if target_tile.data:
                                            if target_tile.data == {} and target_tile.tiles == {}:
                                                target_tile = None

                                        populated_tiles.append(target_tile)

                                        for source_tile in sourcetilegroup:
                                            if source_tile['data']:
                                                for data in source_tile[
                                                        'data']:
                                                    if len(data) > 0:
                                                        need_new_tile = True

                                        if need_new_tile:
                                            if self.get_blank_tile(
                                                    sourcetilegroup,
                                                    blanktilecache, tiles,
                                                    resourceinstanceid
                                            ) != None:
                                                populate_tile(
                                                    sourcetilegroup,
                                                    self.get_blank_tile(
                                                        sourcetilegroup,
                                                        blanktilecache, tiles,
                                                        resourceinstanceid))

                                        if target_tile_cardinality == '1':
                                            populated_nodegroups.append(
                                                str(target_tile.nodegroup_id))
                                    else:
                                        target_tile = None

                                if blank_tile != None:
                                    populate_tile(mapped_tiles, blank_tile)

                    newresourceinstance = ResourceInstance.objects.create(
                        resourceinstanceid=resourceinstanceid,
                        graph_id=target_resource_model,
                        legacyid=None)
                    if len(
                            ResourceInstance.objects.filter(
                                resourceinstanceid=resourceinstanceid)) == 1:
                        reporter.update_resources_saved()

                    # print JSONSerializer().serialize(populated_tiles)
                    for populated_tile in populated_tiles:
                        populated_tile.resourceinstance = newresourceinstance
                        saved_tile = populated_tile.save()
                        # tile_saved = count parent tile and count of tile array if tile array != {}
                        # reporter.update_tiles_saved(tile_saved)

        except (KeyError, TypeError) as e:
            print e

        finally:
            reporter.report_results()
示例#17
0
文件: graph.py 项目: wangsr729/arches
    def post(self, request, graphid=None):
        ret = {}
        try:
            if self.action == "import_graph":
                graph_file = request.FILES.get("importedGraph").read()
                graphs = JSONDeserializer().deserialize(graph_file)["graph"]
                ret = GraphImporter.import_graph(graphs)
            else:
                if graphid is not None:
                    graph = Graph.objects.get(graphid=graphid)
                data = JSONDeserializer().deserialize(request.body)

                if self.action == "new_graph":
                    isresource = data["isresource"] if "isresource" in data else False
                    name = _("New Resource Model") if isresource else _("New Branch")
                    author = request.user.first_name + " " + request.user.last_name
                    ret = Graph.new(name=name, is_resource=isresource, author=author)

                elif self.action == "update_node":
                    updated_values = graph.update_node(data)
                    graph.save()
                    ret = JSONSerializer().serializeToPython(graph)
                    ret["updated_values"] = updated_values
                    ret["default_card_name"] = graph.temp_node_name

                elif self.action == "update_node_layer":
                    nodeid = uuid.UUID(str(data.get("nodeid")))
                    node = graph.nodes[nodeid]
                    node.config = data["config"]
                    ret = graph
                    node.save()

                elif self.action == "append_branch":
                    ret = graph.append_branch(data["property"], nodeid=data["nodeid"], graphid=data["graphid"])
                    ret = ret.serialize()
                    ret["nodegroups"] = graph.get_nodegroups()
                    ret["cards"] = graph.get_cards()
                    ret["widgets"] = graph.get_widgets()
                    graph.save()

                elif self.action == "append_node":
                    ret = graph.append_node(nodeid=data["nodeid"])
                    graph.save()

                elif self.action == "move_node":
                    ret = graph.move_node(data["nodeid"], data["property"], data["newparentnodeid"])
                    graph.save()

                elif self.action == "export_branch":
                    clone_data = graph.copy(root=data)
                    clone_data["copy"].save()
                    ret = {"success": True, "graphid": clone_data["copy"].pk}

                elif self.action == "clone_graph":
                    clone_data = graph.copy()
                    ret = clone_data["copy"]
                    ret.save()
                    ret.copy_functions(graph, [clone_data["nodes"], clone_data["nodegroups"]])

                elif self.action == "reorder_nodes":
                    json = request.body
                    if json is not None:
                        data = JSONDeserializer().deserialize(json)

                        if "nodes" in data and len(data["nodes"]) > 0:
                            sortorder = 0
                            with transaction.atomic():
                                for node in data["nodes"]:
                                    no = models.Node.objects.get(pk=node["nodeid"])
                                    no.sortorder = sortorder
                                    no.save()
                                    sortorder = sortorder + 1
                            ret = data

            return JSONResponse(ret)
        except GraphValidationError as e:
            return JSONErrorResponse(e.title, e.message, {"status": "Failed"})
        except ModelInactiveError as e:
            return JSONErrorResponse(e.title, e.message)
        except RequestError as e:
            return JSONErrorResponse(
                _("Elasticsearch indexing error"),
                _(
                    """If you want to change the datatype of an existing node.  
                    Delete and then re-create the node, or export the branch then edit the datatype and re-import the branch."""
                ),
            )
示例#18
0
def report(request, resourceid):
    logging.warning("Viewing Report. User=%s", request.user)

    # Redirect non-logged-in users to the login screen
    if request.user.is_anonymous:
        redirect('/auth')

    lang = request.GET.get('lang', request.LANGUAGE_CODE)
    page = request.GET.get('page', 1)
    se = SearchEngineFactory().create()
    report_info = se.search(index='resource', id=resourceid)
    primaryname = se.search(index='entity', id=resourceid)
    report_info['source'] = report_info['_source']
    report_info['type'] = report_info['_type']
    report_info['source']['graph'] = report_info['source']['graph']
    if primaryname['_source']['primaryname']:
        report_info['source']['primaryname'] = primaryname['_source'][
            'primaryname']
    del report_info['_source']
    del report_info['_type']
    geometry = JSONSerializer().serialize(report_info['source']['geometry'])
    GeoCrypt = Crypter(settings.ENCODING_KEY)
    iv, encrypted = GeoCrypt.encrypt(geometry, GeoCrypt.KEY)
    ciphertext = binascii.b2a_base64(encrypted).rstrip()
    if geometry != 'null':
        result = {
            'editor':
            'true' if 'edit' in request.user.user_groups else 'false',
            'key': GeoCrypt.KEY,
            'iv': iv,
            'ciphertext': ciphertext
        }
    else:
        result = None

    if report_info[
            'type'] == "INFORMATION_RESOURCE.E73":  # These clauses produce subtypes for Imagery, Shared Dataset and Cartography Info Resources, with the aim of producing different Report pages for each of these Resource Types
        report_info['subtype'] = ''
        report_info['filepath'] = ''
        report_info['has_image'] = ''
        if 'ACQUISITION_ASSIGNMENT_E17' in report_info['source'][
                'graph'] or 'CATALOGUE_ID_E42' in report_info['source'][
                    'graph']:
            report_info['subtype'] = 'Imagery'
        if 'RESOURCE_CREATION_EVENT_E65' in report_info['source']['graph']:
            for value in report_info['source']['graph'][
                    'RESOURCE_CREATION_EVENT_E65']:
                if 'CREATOR_E39' in value:
                    for subvalue in value['CREATOR_E39']:
                        if 'IMAGERY_CREATOR_APPELLATION_E82' in subvalue:
                            report_info['subtype'] = 'Imagery'
                        elif 'SHARED_DATA_SOURCE_CREATOR_APPELLATION_E82' in subvalue:
                            report_info['subtype'] = 'Shared'
                if 'SHARED_DATA_SOURCE_SHARER_E39' in value:
                    report_info['subtype'] = 'Shared'
        if 'PUBLICATION_EVENT_E12' in report_info['source']['graph']:
            for value in report_info['source']['graph'][
                    'PUBLICATION_EVENT_E12']:
                if 'PUBLICATION_ASSIGNMENT_E17' in value:
                    for subvalue in value['PUBLICATION_ASSIGNMENT_E17']:
                        if 'TILE_SQUARE_APPELLATION_E44' in subvalue or 'TILE_SQUARE_DETAILS_E44' in subvalue:
                            report_info['subtype'] = 'Cartography'
                        elif 'IMAGERY_SOURCE_TYPE_E55' in subvalue:
                            report_info['subtype'] = 'Imagery'
        if 'FILE_PATH_E62' in report_info['source']['graph']:
            report_info['filepath'] = report_info['source']['graph'][
                'FILE_PATH_E62'][0]
        if 'THUMBNAIL_E62' in report_info['source']['graph']:
            report_info['has_image'] = report_info['source']['graph'][
                'THUMBNAIL_E62'][0]
        if 'URL_E51' in report_info['source'][
                'graph']:  #If the resource has a URL, it verifies that it is an APAAME json string, in which case it retrieves the url of the photo from the json string and passes it to the report
            flickr_feed = report_info['source']['graph']['URL_E51'][0][
                'URL_E51__value'][:-1] if report_info['source']['graph'][
                    'URL_E51'][0]['URL_E51__value'].endswith(
                        '/') else report_info['source']['graph']['URL_E51'][0][
                            'URL_E51__value']
            try:
                response = urllib.urlopen(
                    'https://www.flickr.com/services/oembed?url=' +
                    flickr_feed + '&format=json')
                data = response.read().decode("utf-8")
                flickr_feed = json.loads(data)
                report_info['filepath'], report_info[
                    'has_image'] = flickr_feed['url'], True
            except:
                pass

    def get_evaluation_path(valueid):
        value = models.Values.objects.get(pk=valueid)
        concept_graph = Concept().get(id=value.conceptid_id,
                                      include_subconcepts=False,
                                      include_parentconcepts=True,
                                      include_relatedconcepts=False,
                                      up_depth_limit=None,
                                      lang=lang)

        paths = []
        for path in concept_graph.get_paths(lang=lang)[0]:
            if path['label'] != 'Arches' and path[
                    'label'] != 'Evaluation Criteria Type':
                paths.append(path['label'])
        return '; '.join(paths)

    concept_label_ids = set()
    uuid_regex = re.compile(
        '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}'
    )

    # gather together all uuid's referenced in the resource graph
    def crawl(items):
        for item in items:
            for key in item:
                if isinstance(item[key], list):
                    crawl(item[key])
                else:
                    if isinstance(item[key], basestring) and uuid_regex.match(
                            item[key]):
                        if key == 'EVALUATION_CRITERIA_TYPE_E55__value':
                            item[key] = get_evaluation_path(item[key])
                        concept_label_ids.add(item[key])

    crawl([report_info['source']['graph']])

    # get all the concept labels from the uuid's
    concept_labels = se.search(index='concept_labels',
                               id=list(concept_label_ids))

    # convert all labels to their localized prefLabel
    temp = {}
    if concept_labels != None:
        for concept_label in concept_labels['docs']:
            #temp[concept_label['_id']] = concept_label
            if concept_label['found']:
                # the resource graph already referenced the preferred label in the desired language
                if concept_label['_source'][
                        'type'] == 'prefLabel' and concept_label['_source'][
                            'language'] == lang:
                    temp[concept_label['_id']] = concept_label['_source']
                else:
                    # the resource graph referenced a non-preferred label or a label not in our target language, so we need to get the right label
                    temp[concept_label['_id']] = get_preflabel_from_conceptid(
                        concept_label['_source']['conceptid'], lang)

    # replace the uuid's in the resource graph with their preferred and localized label
    def crawl_again(items):
        for item in items:
            for key in item:
                if isinstance(item[key], list):
                    crawl_again(item[key])
                else:
                    if isinstance(item[key], basestring) and uuid_regex.match(
                            item[key]):
                        try:
                            item[key] = temp[item[key]]['value']
                        except:
                            pass

    crawl_again([report_info['source']['graph']])

    #return JSONResponse(report_info, indent=4)

    related_resource_dict = {
        'HERITAGE_RESOURCE': [],
        'HERITAGE_RESOURCE_GROUP': [],
        'HERITAGE_FEATURE': [],
        'HERITAGE_COMPONENT': [],
        'ACTIVITY': [],
        'ACTOR': [],
        'HISTORICAL_EVENT': [],
        'INFORMATION_RESOURCE_IMAGE': [],
        'INFORMATION_RESOURCE_DOCUMENT': [],
        'INFORMATION_RESOURCE_MAP': [],
        'INFORMATION_RESOURCE_SATELLITE': [],
        'INFORMATION_RESOURCE_SHARED': []
    }

    related_resource_info = get_related_resources(resourceid, lang)
    # parse the related entities into a dictionary by resource type
    for related_resource in related_resource_info['related_resources']:
        VirtualGlobeName = []
        OtherImageryName = []
        SharedDataset = []
        VirtualGlobe = False
        OtherImagery = True
        information_resource_type = 'DOCUMENT'
        related_res = {}
        related_res['relationship'] = []
        related_res['datefrom'] = []
        related_res['dateto'] = []
        related_res['notes'] = []
        related_res['date'] = []
        related_res['identifier'] = []
        related_res['entitytypeid'] = related_resource['entitytypeid']
        related_res['entityid'] = related_resource['entityid']
        related_res['primaryname'] = related_resource['primaryname']
        if related_resource['entitytypeid'] == 'HERITAGE_PLACE.E27':
            print JSONResponse(related_resource, indent=4)
            for entity in related_resource['child_entities']:
                if entity['entitytypeid'] == 'NAME.E41':
                    related_res['identifier'].append(entity['value'])
        elif related_resource['entitytypeid'] == 'HERITAGE_FEATURE.E24':
            for entity in related_resource['domains']:
                if entity['entitytypeid'] == 'INTERPRETATION_TYPE.I4':
                    related_res['identifier'].append(
                        get_preflabel_from_valueid(entity['value'],
                                                   lang)['value'])
        elif related_resource['entitytypeid'] == 'HERITAGE_COMPONENT.B2':
            for entity in related_resource['domains']:
                if entity['entitytypeid'] == 'COMPONENT_TYPE.E55':
                    related_res['identifier'].append(
                        get_preflabel_from_valueid(entity['value'],
                                                   lang)['value'])
        elif related_resource['entitytypeid'] == 'ACTIVITY.E7':
            for entity in related_resource['domains']:
                if entity['entitytypeid'] == 'ACTIVITY_TYPE.E55':
                    related_res['relationship'].append(
                        get_preflabel_from_valueid(entity['value'],
                                                   lang)['value'])
        elif related_resource['entitytypeid'] == 'ACTOR.E39':
            for entity in related_resource['domains']:
                if entity['entitytypeid'] == 'ACTOR_TYPE.E55':
                    related_res['relationship'].append(
                        get_preflabel_from_conceptid(entity['conceptid'],
                                                     lang)['value'])
                    related_resource['actor_relationshiptype'] = ''
            for entity in related_resource['child_entities']:
                if entity['entitytypeid'] == 'ACTOR_APPELLATION.E82':
                    related_resource['primaryname'] = entity['value']
        elif related_resource['entitytypeid'] == 'HISTORICAL_EVENT.E5':
            for entity in related_resource['domains']:
                if entity['entitytypeid'] == 'HISTORICAL_EVENT_TYPE.E55':
                    related_res['relationship'].append(
                        get_preflabel_from_conceptid(entity['conceptid'],
                                                     lang)['value'])
        elif related_resource['entitytypeid'] == 'INFORMATION_RESOURCE.E73':
            for entity in related_resource['domains']:
                if entity['entitytypeid'] == 'INFORMATION_RESOURCE_TYPE.E55':
                    related_res['relationship'].append(
                        get_preflabel_from_valueid(entity['value'],
                                                   lang)['value'])

            for entity in related_resource['child_entities']:
                if entity['entitytypeid'] == 'FILE_PATH.E62':
                    related_res[
                        'file_path'] = settings.MEDIA_URL + entity['label']
                if entity['entitytypeid'] == 'THUMBNAIL.E62':
                    related_res[
                        'thumbnail'] = settings.MEDIA_URL + entity['label']
                    information_resource_type = 'IMAGE'
                if entity['entitytypeid'] == 'TILE_SQUARE_DETAILS.E44' or entity[
                        'entitytypeid'] == 'TILE_SQUARE_APPELLATION.E44':  #If this node is populated, the Info resource is assumed to be a Map and its default name is set to Sheet Name
                    related_res['primaryname'] = entity['label']
                    information_resource_type = 'MAP'
                elif entity['entitytypeid'] == 'SHARED_DATA_SOURCE_APPELLATION.E82' or entity[
                        'entitytypeid'] == 'SHARED_DATA_SOURCE_AFFILIATION.E82' or entity[
                            'entitytypeid'] == 'SHARED_DATA_SOURCE_CREATOR_APPELLATION.E82':  #If this node is populated, the Info resource is assumed to be a Shared Dataset and its default name is set to Shared Dated Source
                    SharedDataset.append(entity['label'])
                    information_resource_type = 'SHARED'
                elif entity[
                        'entitytypeid'] == 'CATALOGUE_ID.E42':  #If this node is populated, the Info resource is assumed to be Imagery other than VirtualGlobe type
                    OtherImageryName.append(entity['label'])
                    OtherImagery = False
                    information_resource_type = 'SATELLITE'
                elif entity[
                        'entitytypeid'] == 'IMAGERY_CREATOR_APPELLATION.E82':  #If this node is populated, and Catalogue_ID.E42 is not (checked by bool OtherImagery), the Info resource is assumed to be a VirtualGlobe
                    VirtualGlobe = True
                    VirtualGlobeName.append(entity['label'])
                    information_resource_type = 'SATELLITE'
                elif entity['entitytypeid'] == 'TITLE.E41':
                    related_res['primaryname'] = entity['value']

            for entity in related_resource['dates']:
                if entity['entitytypeid'] == 'DATE_OF_ACQUISITION.E50':
                    related_res['date'] = validatedates(entity['label'])
            if VirtualGlobe == True and OtherImagery == True:  #This routine creates the concatenated primary name for a Virtual Globe related resource
                for entity in related_resource['domains']:
                    if entity['entitytypeid'] == 'IMAGERY_SOURCE_TYPE.E55':
                        VirtualGlobeName.append(entity['label'])
                for entity in related_resource['dates']:
                    if entity['entitytypeid'] == 'DATE_OF_ACQUISITION.E50':
                        VirtualGlobeName.append(entity['label'])
                related_res['primaryname'] = " - ".join(VirtualGlobeName)
            elif OtherImagery == False:  #This routine creates the concatenated primary name for Imagery related resource
                for entity in related_resource['dates']:
                    if entity['entitytypeid'] == 'DATE_OF_ACQUISITION.E50':
                        OtherImageryName.append(entity['label'])
                related_res['primaryname'] = " - ".join(OtherImageryName)
            if information_resource_type == 'SHARED':  #This routine creates the concatenated primary name for a Shared dataset
                related_res['primaryname'] = " - ".join(SharedDataset)
        # get the relationship between the two entities as well as the notes and dates, if the exist

        for relationship in related_resource_info['resource_relationships']:
            if relationship['entityid1'] == related_resource[
                    'entityid'] or relationship[
                        'entityid2'] == related_resource['entityid']:
                related_res['relationship'].append(
                    get_preflabel_from_valueid(
                        relationship['relationshiptype'], lang)['value'])
                if relationship['datestarted']:
                    related_res['datefrom'] = relationship['datestarted']
                if relationship['dateended']:
                    related_res['dateto'] = relationship['dateended']
                if relationship['notes']:
                    related_res['notes'] = relationship['notes']
        entitytypeidkey = related_resource['entitytypeid'].split('.')[0]
        if entitytypeidkey == 'INFORMATION_RESOURCE':
            entitytypeidkey = '%s_%s' % (entitytypeidkey,
                                         information_resource_type)
        related_resource_dict[entitytypeidkey].append(related_res)
    return render_to_response(
        'resource-report.htm',
        {
            'geometry': JSONSerializer().serialize(result),
            #             'geometry': JSONSerializer().serialize(report_info['source']['geometry']),
            'resourceid': resourceid,
            'report_template': 'views/reports/' + report_info['type'] + '.htm',
            'report_info': report_info,
            'related_resource_dict': related_resource_dict,
            'main_script': 'resource-report',
            'active_page': 'ResourceReport',
            'BingDates': getdates(report_info['source']['geometry']
                                  )  # Retrieving the dates of Bing Imagery
        },
        context_instance=RequestContext(request))
示例#19
0
文件: graph.py 项目: wangsr729/arches
 def get(self, request):
     icons = models.Icon.objects.order_by("name")
     data = {"icons": JSONSerializer().serializeToPython(icons)}
     return JSONResponse(data)
示例#20
0
 def __str__(self):
     return JSONSerializer().serialize(self.dsl, indent=4)
示例#21
0
def build_base_search_results_dsl(request):
    term_filter = request.GET.get('termFilter', '')
    spatial_filter = JSONDeserializer().deserialize(request.GET.get('spatialFilter', None)) 
    export = request.GET.get('export', None)
    page = 1 if request.GET.get('page') == '' else int(request.GET.get('page', 1))
    temporal_filter = JSONDeserializer().deserialize(request.GET.get('temporalFilter', None))

    se = SearchEngineFactory().create()

    if export != None:
        limit = settings.SEARCH_EXPORT_ITEMS_PER_PAGE  
    else:
        limit = settings.SEARCH_ITEMS_PER_PAGE
    
    query = Query(se, start=limit*int(page-1), limit=limit)
    boolquery = Bool()
    boolfilter = Bool()
    
    if term_filter != '':
        # Ce uporabnik ni avtenticiran, prikazemo le veljavne (to je verjetno potrebno se dodelati (mogoce da vidijo le svoje???)!!!)
        if (request.user.username == 'anonymous'):
            auto_filter = []
            for item in JSONDeserializer().deserialize(term_filter):
               auto_filter.append(item) 
            
            # Poiscimo concept id in context za Published status
            AUTO_TERM_FILTER = get_auto_filter(request)
            
            auto_filter.append(AUTO_TERM_FILTER)
            term_filter = JSONSerializer().serialize(auto_filter)
            
    print 'term_filter'
    if term_filter != '':
        for term in JSONDeserializer().deserialize(term_filter):
            print term
            if term['type'] == 'term':
                entitytype = models.EntityTypes.objects.get(conceptid_id=term['context'])
                boolfilter_nested = Bool()
                boolfilter_nested.must(Terms(field='child_entities.entitytypeid', terms=[entitytype.pk]))
                boolfilter_nested.must(Match(field='child_entities.value', query=term['value'], type='phrase'))
                nested = Nested(path='child_entities', query=boolfilter_nested)
                if term['inverted']:
                    boolfilter.must_not(nested)
                else:    
                    boolfilter.must(nested)
            elif term['type'] == 'concept':
                concept_ids = _get_child_concepts(term['value'])
                terms = Terms(field='domains.conceptid', terms=concept_ids)
                nested = Nested(path='domains', query=terms)
                if term['inverted']:
                    boolfilter.must_not(nested)
                else:
                    boolfilter.must(nested)
            elif term['type'] == 'string':
                boolfilter_folded = Bool()
                boolfilter_folded.should(Match(field='child_entities.value', query=term['value'], type='phrase_prefix'))
                boolfilter_folded.should(Match(field='child_entities.value.folded', query=term['value'], type='phrase_prefix'))
                nested = Nested(path='child_entities', query=boolfilter_folded)
                if term['inverted']:
                    boolquery.must_not(nested)
                else:    
                    boolquery.must(nested)
    if 'geometry' in spatial_filter and 'type' in spatial_filter['geometry'] and spatial_filter['geometry']['type'] != '':
        geojson = spatial_filter['geometry']
        if geojson['type'] == 'bbox':
            coordinates = [[geojson['coordinates'][0],geojson['coordinates'][3]], [geojson['coordinates'][2],geojson['coordinates'][1]]]
            geoshape = GeoShape(field='geometries.value', type='envelope', coordinates=coordinates )
            nested = Nested(path='geometries', query=geoshape)
        else:
            buffer = spatial_filter['buffer']
            geojson = JSONDeserializer().deserialize(_buffer(geojson,buffer['width'],buffer['unit']).json)
            geoshape = GeoShape(field='geometries.value', type=geojson['type'], coordinates=geojson['coordinates'] )
            nested = Nested(path='geometries', query=geoshape)

        if 'inverted' not in spatial_filter:
            spatial_filter['inverted'] = False

        if spatial_filter['inverted']:
            boolfilter.must_not(nested)
        else:
            boolfilter.must(nested)

    if 'year_min_max' in temporal_filter and len(temporal_filter['year_min_max']) == 2:
        start_date = date(temporal_filter['year_min_max'][0], 1, 1)
        end_date = date(temporal_filter['year_min_max'][1], 12, 31)
        if start_date:
            start_date = start_date.isoformat()
        if end_date:
            end_date = end_date.isoformat()
        range = Range(field='dates.value', gte=start_date, lte=end_date)
        nested = Nested(path='dates', query=range)
        
        if 'inverted' not in temporal_filter:
            temporal_filter['inverted'] = False

        if temporal_filter['inverted']:
            boolfilter.must_not(nested)
        else:
            boolfilter.must(nested)
        
    if not boolquery.empty:
        query.add_query(boolquery)

    if not boolfilter.empty:
        query.add_filter(boolfilter)

    return query
示例#22
0
    def import_business_data(self, business_data, mapping=None):
        reporter = ResourceImportReporter(business_data)
        try:
            if mapping == None or mapping == '':
                for resource in business_data['resources']:
                    if resource['resourceinstance'] != None:

                        resourceinstance, created = ResourceInstance.objects.update_or_create(
                            resourceinstanceid=uuid.UUID(
                                str(resource['resourceinstance']
                                    ['resourceinstanceid'])),
                            graph_id=uuid.UUID(
                                str(resource['resourceinstance']['graph_id'])),
                            legacyid=resource['resourceinstance']['legacyid'])
                        if len(
                                ResourceInstance.objects.filter(
                                    resourceinstanceid=resource[
                                        'resourceinstance']
                                    ['resourceinstanceid'])) == 1:
                            reporter.update_resources_saved()

                    if resource['tiles'] != []:
                        reporter.update_tiles(len(resource['tiles']))
                        for tile in resource['tiles']:
                            tile['parenttile_id'] = uuid.UUID(
                                str(tile['parenttile_id'])
                            ) if tile['parenttile_id'] else None

                            tile, created = Tile.objects.update_or_create(
                                resourceinstance=resourceinstance,
                                parenttile=Tile(
                                    uuid.UUID(str(tile['parenttile_id'])))
                                if tile['parenttile_id'] else None,
                                nodegroup=NodeGroup(
                                    uuid.UUID(str(tile['nodegroup_id'])))
                                if tile['nodegroup_id'] else None,
                                tileid=uuid.UUID(str(tile['tileid'])),
                                data=tile['data'])
                            if len(Tile.objects.filter(
                                    tileid=tile.tileid)) == 1:
                                reporter.update_tiles_saved()

                for relation in business_data['relations']:
                    relation = ResourceXResource.objects.update_or_create(
                        resourcexid=uuid.UUID(str(relation['resourcexid'])),
                        resourceinstanceidfrom=ResourceInstance(
                            uuid.UUID(str(
                                relation['resourceinstanceidfrom']))),
                        resourceinstanceidto=ResourceInstance(
                            uuid.UUID(str(relation['resourceinstanceidto']))),
                        notes=relation['notes'],
                        relationshiptype=uuid.UUID(
                            str(relation['relationshiptype'])),
                        datestarted=relation['datestarted'],
                        dateended=relation['dateended'])
                    if len(
                            ResourceXResource.objects.filter(
                                resourcexid=relation['resourcexid'])) == 1:
                        reporter.update_relations_saved()
            else:

                blanktilecache = {}
                target_nodegroup_cardinalities = {}
                for nodegroup in JSONSerializer().serializeToPython(
                        NodeGroup.objects.all()):
                    target_nodegroup_cardinalities[
                        nodegroup['nodegroupid']] = nodegroup['cardinality']

                def replace_source_nodeid(tiles, mapping):
                    for tile in tiles:
                        new_data = []
                        for sourcekey in tile['data'].keys():
                            for row in mapping['nodes']:
                                if row['file_field_name'] == sourcekey:
                                    d = {}
                                    d[row['arches_nodeid']] = tile['data'][
                                        sourcekey]
                                    new_data.append(d)
                                    # tile['data'][row['targetnodeid']] = tile['data'][sourcekey]
                                    # del tile['data'][sourcekey]
                        tile['data'] = new_data
                    return tiles

                def cache(blank_tile):
                    if blank_tile.data != {}:
                        for tile in blank_tile.tiles.values():
                            if isinstance(tile, Tile):
                                for key in tile.data.keys():
                                    blanktilecache[key] = blank_tile
                    # else:
                    #     print blank_tile

                for resource in business_data['resources']:
                    reporter.update_tiles(len(resource['tiles']))
                    parenttileids = []
                    populated_tiles = []
                    resourceinstanceid = uuid.uuid4()
                    populated_nodegroups = []

                    target_resource_model = mapping['resource_model_id']

                    for tile in resource['tiles']:
                        if tile['data'] != {}:

                            def get_tiles(tile):
                                if tile['parenttile_id'] != None:
                                    if tile['parenttile_id'] not in parenttileids:
                                        parenttileids.append(
                                            tile['parenttile_id'])
                                        ret = []
                                        for sibling_tile in resource['tiles']:
                                            if sibling_tile[
                                                    'parenttile_id'] == tile[
                                                        'parenttile_id']:
                                                ret.append(sibling_tile)
                                    else:
                                        ret = None
                                else:
                                    ret = [tile]

                                #deletes nodes that don't have values
                                if ret is not None:
                                    for tile in ret:
                                        for key, value in tile[
                                                'data'].iteritems():
                                            if value == "":
                                                del tile['data'][key]
                                return ret

                            def get_blank_tile(sourcetilegroup):
                                if len(sourcetilegroup[0]['data']) > 0:
                                    if sourcetilegroup[0]['data'][0] != {}:
                                        if sourcetilegroup[0]['data'][0].keys(
                                        )[0] not in blanktilecache:
                                            blank_tile = Tile.get_blank_tile(
                                                tiles[0]['data'][0].keys()[0],
                                                resourceid=resourceinstanceid)
                                            cache(blank_tile)
                                        else:
                                            blank_tile = blanktilecache[
                                                tiles[0]['data'][0].keys()[0]]
                                    else:
                                        blank_tile = None
                                else:
                                    blank_tile = None
                                return blank_tile

                            tiles = get_tiles(tile)
                            if tiles is not None:
                                mapped_tiles = replace_source_nodeid(
                                    tiles, mapping)
                                blank_tile = get_blank_tile(tiles)

                                def populate_tile(sourcetilegroup,
                                                  target_tile):
                                    need_new_tile = False
                                    target_tile_cardinality = target_nodegroup_cardinalities[
                                        str(target_tile.nodegroup_id)]
                                    if str(target_tile.nodegroup_id
                                           ) not in populated_nodegroups:
                                        if target_tile.data != {}:
                                            for source_tile in sourcetilegroup:
                                                for tiledata in source_tile[
                                                        'data']:
                                                    for nodeid in tiledata.keys(
                                                    ):
                                                        if nodeid in target_tile.data:
                                                            if target_tile.data[
                                                                    nodeid] == None:
                                                                target_tile.data[
                                                                    nodeid] = tiledata[
                                                                        nodeid]
                                                                for key in tiledata.keys(
                                                                ):
                                                                    if key == nodeid:
                                                                        del tiledata[
                                                                            nodeid]
                                                for tiledata in source_tile[
                                                        'data']:
                                                    if tiledata == {}:
                                                        source_tile[
                                                            'data'].remove(
                                                                tiledata)

                                        elif target_tile.tiles != None:
                                            populated_child_nodegroups = []
                                            for nodegroupid, childtile in target_tile.tiles.iteritems(
                                            ):
                                                childtile_empty = True
                                                child_tile_cardinality = target_nodegroup_cardinalities[
                                                    str(childtile[0].
                                                        nodegroup_id)]
                                                if str(
                                                        childtile[0].
                                                        nodegroup_id
                                                ) not in populated_child_nodegroups:
                                                    prototype_tile = childtile.pop(
                                                    )
                                                    prototype_tile.tileid = None

                                                    for source_tile in sourcetilegroup:
                                                        if prototype_tile.nodegroup_id not in populated_child_nodegroups:
                                                            prototype_tile_copy = deepcopy(
                                                                prototype_tile)

                                                            for data in source_tile[
                                                                    'data']:
                                                                for nodeid in data.keys(
                                                                ):
                                                                    if nodeid in prototype_tile.data.keys(
                                                                    ):
                                                                        if prototype_tile.data[
                                                                                nodeid] == None:
                                                                            prototype_tile_copy.data[
                                                                                nodeid] = data[
                                                                                    nodeid]
                                                                            for key in data.keys(
                                                                            ):
                                                                                if key == nodeid:
                                                                                    del data[
                                                                                        nodeid]
                                                                            if child_tile_cardinality == '1':
                                                                                populated_child_nodegroups.append(
                                                                                    prototype_tile
                                                                                    .
                                                                                    nodegroup_id
                                                                                )
                                                            for data in source_tile[
                                                                    'data']:
                                                                if data == {}:
                                                                    source_tile[
                                                                        'data'].remove(
                                                                            data
                                                                        )

                                                            for key in prototype_tile_copy.data.keys(
                                                            ):
                                                                if prototype_tile_copy.data[
                                                                        key] != None:
                                                                    childtile_empty = False
                                                            if prototype_tile_copy.data == {} or childtile_empty:
                                                                prototype_tile_copy = None
                                                            if prototype_tile_copy is not None:
                                                                childtile.append(
                                                                    prototype_tile_copy
                                                                )
                                                        else:
                                                            break

                                        if target_tile.data:
                                            if target_tile.data == {} and target_tile.tiles == {}:
                                                target_tile = None

                                        populated_tiles.append(target_tile)

                                        for source_tile in sourcetilegroup:
                                            if source_tile['data']:
                                                for data in source_tile[
                                                        'data']:
                                                    if len(data) > 0:
                                                        need_new_tile = True

                                        if need_new_tile:
                                            if get_blank_tile(
                                                    sourcetilegroup) != None:
                                                populate_tile(
                                                    sourcetilegroup,
                                                    get_blank_tile(
                                                        sourcetilegroup))

                                        if target_tile_cardinality == '1':
                                            populated_nodegroups.append(
                                                str(target_tile.nodegroup_id))
                                    else:
                                        target_tile = None

                                if blank_tile != None:
                                    populate_tile(mapped_tiles, blank_tile)

                    newresourceinstance = ResourceInstance.objects.create(
                        resourceinstanceid=resourceinstanceid,
                        graph_id=target_resource_model,
                        legacyid=None)
                    if len(
                            ResourceInstance.objects.filter(
                                resourceinstanceid=resourceinstanceid)) == 1:
                        reporter.update_resources_saved()

                    # print JSONSerializer().serialize(populated_tiles)
                    for populated_tile in populated_tiles:
                        populated_tile.resourceinstance = newresourceinstance
                        saved_tile = populated_tile.save()
                        # tile_saved = count parent tile and count of tile array if tile array != {}
                        # reporter.update_tiles_saved(tile_saved)

        except (KeyError, TypeError) as e:
            print e

        finally:
            reporter.report_results()
示例#23
0
def concept(request, conceptid):
    f = request.GET.get('f', 'json')
    mode = request.GET.get('mode', '')
    lang = request.GET.get('lang', settings.LANGUAGE_CODE)
    pretty = request.GET.get('pretty', False)

    if request.method == 'GET':

        include_subconcepts = request.GET.get('include_subconcepts', 'true') == 'true'
        include_parentconcepts = request.GET.get('include_parentconcepts', 'true') == 'true'
        include_relatedconcepts = request.GET.get('include_relatedconcepts', 'true') == 'true'
        emulate_elastic_search = request.GET.get('emulate_elastic_search', 'false') == 'true'
        depth_limit = request.GET.get('depth_limit', None)

        if f == 'html':
            depth_limit = 1
            if not conceptid:
                return render(request, 'views/rdm/concept-report.htm', {
                    'lang': lang,
                    'concept_count': models.Concept.objects.filter(nodetype='Concept').count(),
                    'collection_count': models.Concept.objects.filter(nodetype='Collection').count(),
                    'scheme_count': models.Concept.objects.filter(nodetype='ConceptScheme').count(),
                    'entitytype_count': models.Concept.objects.filter(nodetype='EntityType').count(),
                    'default_report': True
                })

        ret = []
        labels = []
        this_concept = Concept().get(id=conceptid)

        if f == 'html':
            if mode == '' and (this_concept.nodetype == 'Concept' or this_concept.nodetype == 'ConceptScheme' or this_concept.nodetype == 'EntityType'):
                concept_graph = Concept().get(id=conceptid, include_subconcepts=include_subconcepts,
                    include_parentconcepts=include_parentconcepts, include_relatedconcepts=include_relatedconcepts,
                    depth_limit=depth_limit, up_depth_limit=None, lang=lang)
            else:
                concept_graph = Concept().get(id=conceptid, include_subconcepts=include_subconcepts,
                    include_parentconcepts=include_parentconcepts, include_relatedconcepts=include_relatedconcepts,
                    depth_limit=depth_limit, up_depth_limit=None, lang=lang, semantic=False)

            languages = models.DLanguage.objects.all()
            valuetypes = models.DValueType.objects.all()
            relationtypes = models.DRelationType.objects.all()
            prefLabel = concept_graph.get_preflabel(lang=lang)
            for subconcept in concept_graph.subconcepts:
                subconcept.prefLabel = subconcept.get_preflabel(lang=lang)
            for relatedconcept in concept_graph.relatedconcepts:
                relatedconcept.prefLabel = relatedconcept.get_preflabel(lang=lang)
            for value in concept_graph.values:
                if value.category == 'label':
                    labels.append(value)

            if mode == '' and (this_concept.nodetype == 'Concept' or this_concept.nodetype == 'ConceptScheme' or this_concept.nodetype == 'EntityType'):
                if concept_graph.nodetype == 'ConceptScheme':
                    parent_relations = relationtypes.filter(category='Properties')
                else:
                    parent_relations = relationtypes.filter(category='Semantic Relations').exclude(relationtype = 'related').exclude(relationtype='broader').exclude(relationtype='broaderTransitive')
                return render(request, 'views/rdm/concept-report.htm', {
                    'lang': lang,
                    'prefLabel': prefLabel,
                    'labels': labels,
                    'concept': concept_graph,
                    'languages': languages,
                    'sparql_providers': get_sparql_providers(),
                    'valuetype_labels': valuetypes.filter(category='label'),
                    'valuetype_notes': valuetypes.filter(category='note'),
                    'valuetype_related_values': valuetypes.filter(category='undefined'),
                    'parent_relations': parent_relations,
                    'related_relations': relationtypes.filter(Q(category='Mapping Properties') | Q(relationtype = 'related')),
                    'concept_paths': concept_graph.get_paths(lang=lang),
                    'graph_json': JSONSerializer().serialize(concept_graph.get_node_and_links(lang=lang)),
                    'direct_parents': [parent.get_preflabel(lang=lang) for parent in concept_graph.parentconcepts]
                })
            else:
                return render(request, 'views/rdm/entitytype-report.htm', {
                    'lang': lang,
                    'prefLabel': prefLabel,
                    'labels': labels,
                    'concept': concept_graph,
                    'languages': languages,
                    'valuetype_labels': valuetypes.filter(category='label'),
                    'valuetype_notes': valuetypes.filter(category='note'),
                    'valuetype_related_values': valuetypes.filter(category='undefined'),
                    'related_relations': relationtypes.filter(relationtype = 'member'),
                    'concept_paths': concept_graph.get_paths(lang=lang)
                })


        concept_graph = Concept().get(id=conceptid, include_subconcepts=include_subconcepts,
                include_parentconcepts=include_parentconcepts, include_relatedconcepts=include_relatedconcepts,
                depth_limit=depth_limit, up_depth_limit=None, lang=lang)

        if f == 'skos':
            include_parentconcepts = False
            include_subconcepts = True
            depth_limit = None
            skos = SKOSWriter()
            return HttpResponse(skos.write(concept_graph, format="pretty-xml"), content_type="application/xml")

        if emulate_elastic_search:
            ret.append({'_type': id, '_source': concept_graph})
        else:
            ret.append(concept_graph)

        if emulate_elastic_search:
            ret = {'hits':{'hits':ret}}

        return JSONResponse(ret, indent=4 if pretty else None)

    if request.method == 'POST':

        if len(request.FILES) > 0:
            skosfile = request.FILES.get('skosfile', None)
            imagefile = request.FILES.get('file', None)

            if imagefile:
                value = models.FileValue(valueid = str(uuid.uuid4()), value = request.FILES.get('file', None), concept_id = conceptid, valuetype_id = 'image',language_id = settings.LANGUAGE_CODE)
                value.save()
                return JSONResponse(value)

            elif skosfile:
                overwrite_options = request.POST.get('overwrite_options', None)
                skos = SKOSReader()
                rdf = skos.read_file(skosfile)
                ret = skos.save_concepts_from_skos(rdf, overwrite_options)
                return JSONResponse(ret)

        else:
            data = JSONDeserializer().deserialize(request.body)
            if data:
                with transaction.atomic():
                    concept = Concept(data)
                    concept.save()
                    concept.index()

                    return JSONResponse(concept)


    if request.method == 'DELETE':
        data = JSONDeserializer().deserialize(request.body)

        if data:
            with transaction.atomic():

                concept = Concept(data)

                delete_self = data['delete_self'] if 'delete_self' in data else False
                if not (delete_self and concept.id in CORE_CONCEPTS):
                    in_use = False
                    if delete_self:
                        check_concept = Concept().get(data['id'], include_subconcepts=True)
                        in_use = check_concept.check_if_concept_in_use()
                    if 'subconcepts' in data:
                        for subconcept in data['subconcepts']:
                            if in_use == False:
                                check_concept = Concept().get(subconcept['id'], include_subconcepts=True)
                                in_use = check_concept.check_if_concept_in_use()

                    if in_use == False:
                        concept.delete_index(delete_self=delete_self)
                        concept.delete(delete_self=delete_self)
                    else:
                        return JSONResponse({"in_use": in_use})

                return JSONResponse(concept)

    return HttpResponseNotFound
    def serialize_for_mobile(self):
        """
        serialize to a different form than used by the internal class structure
        used to append additional values (like parent ontology properties) that
        internal objects (like models.Nodes) don't support
        """
        serializer = JSONSerializer()
        serializer.geom_format = 'geojson'
        obj = serializer.handle_model(self)
        ordered_cards = self.get_ordered_cards()
        expired = False
        try:
            expired = (datetime.strptime(str(self.enddate), '%Y-%m-%d') -
                       datetime.now() + timedelta(hours=24)).days < 0
        except ValueError:
            pass
        ret = JSONSerializer().serializeToPython(obj)
        if expired is True:
            self.active = False
            super(MobileSurvey, self).save()
            ret['active'] = False
        graphs = []
        card_lookup = {}
        for card in self.cards.all():
            if str(card.graph_id) in card_lookup:
                card_lookup[str(card.graph_id)].append(card)
            else:
                card_lookup[str(card.graph_id)] = [card]
        for graphid, cards in iter(list(card_lookup.items())):
            graph = Graph.objects.get(pk=graphid)
            graph_obj = graph.serialize(exclude=[
                'domain_connections', 'edges', 'relatable_resource_model_ids'
            ])
            graph_obj['widgets'] = list(
                models.CardXNodeXWidget.objects.filter(
                    card__graph=graph).distinct())
            nodegroupids = []
            for card in cards:
                topcard = Card.objects.get(pk=card.cardid)
                self.collect_card_widget_node_data(graph_obj, graph, topcard,
                                                   nodegroupids)
            graph_obj['widgets'] = serializer.serializeToPython(
                graph_obj['widgets'])

            nodegroup_filters = {
                'nodes': 'nodegroup_id',
                'cards': 'nodegroup_id',
                'nodegroups': 'nodegroupid'
            }

            for prop, id in iter(list(nodegroup_filters.items())):
                relevant_items = [
                    item for item in graph_obj[prop]
                    if item[id] in nodegroupids
                ]
                graph_obj[prop] = relevant_items

            relevant_cardids = [card['cardid'] for card in graph_obj['cards']]
            relevant_widgets = [
                widget for widget in graph_obj['widgets']
                if str(widget['card_id']) in relevant_cardids
            ]
            graph_obj['widgets'] = relevant_widgets

            graphs.append(serializer.serializeToPython(graph_obj))

        ret['graphs'] = graphs
        ret['cards'] = ordered_cards
        try:
            bounds = json.loads(ret['bounds'])
            ret['bounds'] = bounds
            if (bounds['type'] == 'MultiPolygon'):
                singlepart = GeoUtils().convert_multipart_to_singlepart(bounds)
                ret['bounds'] = singlepart
        except TypeError as e:
            logger.error('Could not parse {0}, {1}'.format(ret['bounds'], e))
        return ret
示例#25
0
    def get(self, request):
        if self.action == 'tile_history':
            start = request.GET.get('start')
            end = request.GET.get('end')
            edits = EditLog.objects.filter(
                provisional_userid=request.user.id).filter(
                    timestamp__range=[start, end]).order_by(
                        'tileinstanceid', 'timestamp')
            resourceinstanceids = [
                e['resourceinstanceid']
                for e in edits.values('resourceinstanceid')
            ]
            deleted_resource_edits = EditLog.objects.filter(
                resourceinstanceid__in=resourceinstanceids).filter(
                    edittype='delete')
            deleted_resource_instances = [
                e['resourceinstanceid']
                for e in deleted_resource_edits.values('resourceinstanceid')
            ]
            summary = {}
            for edit in edits:
                if edit.tileinstanceid not in summary:
                    summary[edit.tileinstanceid] = {
                        'pending': False,
                        'tileid': edit.tileinstanceid
                    }
                summary[edit.tileinstanceid]['lasttimestamp'] = edit.timestamp
                summary[edit.tileinstanceid][
                    'lastedittype'] = edit.provisional_edittype
                summary[edit.tileinstanceid]['reviewer'] = ''
                summary[edit.tileinstanceid][
                    'resourceinstanceid'] = edit.resourceinstanceid
                summary[edit.tileinstanceid][
                    'resourcedisplayname'] = edit.resourcedisplayname
                summary[edit.tileinstanceid][
                    'resourcemodelid'] = edit.resourceclassid
                summary[edit.tileinstanceid]['nodegroupid'] = edit.nodegroupid
                summary[edit.tileinstanceid][
                    'resource_deleted'] = True if edit.resourceinstanceid in deleted_resource_instances else False
                if edit.provisional_edittype in ['accept edit', 'delete edit']:
                    summary[
                        edit.tileinstanceid]['reviewer'] = edit.user_username

            chronological_summary = []
            resource_models = models.GraphModel.objects.filter(
                isresource=True).exclude(
                    graphid=settings.SYSTEM_SETTINGS_RESOURCE_MODEL_ID).values(
                        'iconclass', 'color', 'graphid', 'name')
            cards = models.CardModel.objects.all().values(
                'name', 'nodegroup_id')
            card_lookup = {str(card['nodegroup_id']): card for card in cards}
            resource_model_lookup = {
                str(graph['graphid']): graph
                for graph in resource_models
            }
            for k, v in summary.iteritems():
                if v['lastedittype'] not in ['accept edit', 'delete edit']:
                    if models.TileModel.objects.filter(pk=k).exists():
                        tile = models.TileModel.objects.get(pk=k)
                        if tile.provisionaledits is not None and str(
                                request.user.id) in tile.provisionaledits:
                            v['pending'] = True

                v['resourcemodel'] = resource_model_lookup[
                    v['resourcemodelid']]
                v['card'] = card_lookup[v['nodegroupid']]
                if 'graphid' in v['resourcemodel']:
                    v['resourcemodel'].pop('graphid')
                if 'nodegroup_id' in v['card']:
                    v['card'].pop('nodegroup_id')
                chronological_summary.append(v)

            return JSONResponse(JSONSerializer().serialize(
                sorted(chronological_summary,
                       key=lambda k: k['lasttimestamp'],
                       reverse=True)))
示例#26
0
def search_results(request):
    try:
        search_results_dsl = build_search_results_dsl(request)
    except Exception as err:
        return JSONResponse(err.message, status=500)

    dsl = search_results_dsl['query']
    search_buffer = search_results_dsl['search_buffer']
    dsl.include('graph_id')
    dsl.include('root_ontology_class')
    dsl.include('resourceinstanceid')
    dsl.include('points')
    dsl.include('geometries')
    dsl.include('displayname')
    dsl.include('displaydescription')
    dsl.include('map_popup')
    dsl.include('provisional_resource')

    results = dsl.search(index='resource', doc_type=get_doc_type(request))

    if results is not None:
        user_is_reviewer = request.user.groups.filter(
            name='Resource Reviewer').exists()
        total = results['hits']['total']
        page = 1 if request.GET.get('page') == '' else int(
            request.GET.get('page', 1))

        paginator, pages = get_paginator(request, results, total, page,
                                         settings.SEARCH_ITEMS_PER_PAGE)
        page = paginator.page(page)

        # only reuturn points and geometries a user is allowed to view
        geojson_nodes = get_nodegroups_by_datatype_and_perm(
            request, 'geojson-feature-collection', 'read_nodegroup')

        for result in results['hits']['hits']:
            result['_source']['points'] = select_geoms_for_results(
                result['_source']['points'], geojson_nodes, user_is_reviewer)
            result['_source']['geometries'] = select_geoms_for_results(
                result['_source']['geometries'], geojson_nodes,
                user_is_reviewer)

        ret = {}
        ret['results'] = results
        ret['search_buffer'] = JSONSerializer().serialize(
            search_buffer) if search_buffer != None else None
        ret['paginator'] = {}
        ret['paginator']['current_page'] = page.number
        ret['paginator']['has_next'] = page.has_next()
        ret['paginator']['has_previous'] = page.has_previous()
        ret['paginator']['has_other_pages'] = page.has_other_pages()
        ret['paginator']['next_page_number'] = page.next_page_number(
        ) if page.has_next() else None
        ret['paginator']['previous_page_number'] = page.previous_page_number(
        ) if page.has_previous() else None
        ret['paginator']['start_index'] = page.start_index()
        ret['paginator']['end_index'] = page.end_index()
        ret['paginator']['pages'] = pages
        ret['reviewer'] = user_is_reviewer

        return JSONResponse(ret)
    else:
        return HttpResponseNotFound(
            _("There was an error retrieving the search results"))
示例#27
0
    def get(
        self,
        request,
        graphid=None,
        resourceid=None,
        view_template="views/resource/editor.htm",
        main_script="views/resource/editor",
        nav_menu=True,
    ):
        if self.action == "copy":
            return self.copy(request, resourceid)

        creator = None
        user_created_instance = None
        if resourceid is None:
            resource_instance = None
            graph = models.GraphModel.objects.get(pk=graphid)
            resourceid = ""
        else:
            resource_instance = Resource.objects.get(pk=resourceid)
            graph = resource_instance.graph
            instance_creator = get_instance_creator(resource_instance, request.user)
            creator = instance_creator["creatorid"]
            user_created_instance = instance_creator["user_can_edit_instance_permissions"]
        nodes = graph.node_set.all()
        resource_graphs = (
            models.GraphModel.objects.exclude(pk=settings.SYSTEM_SETTINGS_RESOURCE_MODEL_ID)
            .exclude(isresource=False)
            .exclude(isactive=False)
        )
        ontologyclass = [node for node in nodes if node.istopnode is True][0].ontologyclass or ""
        relationship_type_values = get_resource_relationship_types()
        nodegroups = []
        editable_nodegroups = []
        for node in nodes:
            if node.is_collector:
                added = False
                if request.user.has_perm("write_nodegroup", node.nodegroup):
                    editable_nodegroups.append(node.nodegroup)
                    nodegroups.append(node.nodegroup)
                    added = True
                if not added and request.user.has_perm("read_nodegroup", node.nodegroup):
                    nodegroups.append(node.nodegroup)

        nodes = nodes.filter(nodegroup__in=nodegroups)
        cards = graph.cardmodel_set.order_by("sortorder").filter(nodegroup__in=nodegroups).prefetch_related("cardxnodexwidget_set")
        cardwidgets = [
            widget for widgets in [card.cardxnodexwidget_set.order_by("sortorder").all() for card in cards] for widget in widgets
        ]
        widgets = models.Widget.objects.all()
        card_components = models.CardComponent.objects.all()
        applied_functions = JSONSerializer().serialize(models.FunctionXGraph.objects.filter(graph=graph))
        datatypes = models.DDataType.objects.all()
        user_is_reviewer = user_is_resource_reviewer(request.user)
        is_system_settings = False

        if resource_instance is None:
            tiles = []
            displayname = _("New Resource")
        else:
            displayname = resource_instance.displayname
            if displayname == "undefined":
                displayname = _("Unnamed Resource")
            if str(resource_instance.graph_id) == settings.SYSTEM_SETTINGS_RESOURCE_MODEL_ID:
                is_system_settings = True
                displayname = _("System Settings")

            tiles = resource_instance.tilemodel_set.order_by("sortorder").filter(nodegroup__in=nodegroups)
            provisionaltiles = []
            for tile in tiles:
                append_tile = True
                isfullyprovisional = False
                if tile.provisionaledits is not None:
                    if len(list(tile.provisionaledits.keys())) > 0:
                        if len(tile.data) == 0:
                            isfullyprovisional = True
                        if user_is_reviewer is False:
                            if str(request.user.id) in tile.provisionaledits:
                                tile.provisionaledits = {str(request.user.id): tile.provisionaledits[str(request.user.id)]}
                                tile.data = tile.provisionaledits[str(request.user.id)]["value"]
                            else:
                                if isfullyprovisional is True:
                                    # if the tile IS fully provisional and the current user is not the owner,
                                    # we don't send that tile back to the client.
                                    append_tile = False
                                else:
                                    # if the tile has authoritaive data and the current user is not the owner,
                                    # we don't send the provisional data of other users back to the client.
                                    tile.provisionaledits = None
                if append_tile is True:
                    provisionaltiles.append(tile)
            tiles = provisionaltiles
        map_layers = models.MapLayer.objects.all()
        map_markers = models.MapMarker.objects.all()
        map_sources = models.MapSource.objects.all()
        geocoding_providers = models.Geocoder.objects.all()
        templates = models.ReportTemplate.objects.all()

        cards = JSONSerializer().serializeToPython(cards)
        editable_nodegroup_ids = [str(nodegroup.pk) for nodegroup in editable_nodegroups]
        for card in cards:
            card["is_writable"] = False
            if str(card["nodegroup_id"]) in editable_nodegroup_ids:
                card["is_writable"] = True
        can_delete = user_can_delete_resource(request.user, resourceid)
        context = self.get_context_data(
            main_script=main_script,
            resourceid=resourceid,
            displayname=displayname,
            graphid=graph.graphid,
            graphiconclass=graph.iconclass,
            graphname=graph.name,
            ontologyclass=ontologyclass,
            resource_graphs=resource_graphs,
            relationship_types=relationship_type_values,
            widgets=widgets,
            widgets_json=JSONSerializer().serialize(widgets),
            card_components=card_components,
            card_components_json=JSONSerializer().serialize(card_components),
            tiles=JSONSerializer().serialize(tiles),
            cards=JSONSerializer().serialize(cards),
            applied_functions=applied_functions,
            nodegroups=JSONSerializer().serialize(nodegroups),
            nodes=JSONSerializer().serialize(nodes),
            cardwidgets=JSONSerializer().serialize(cardwidgets),
            datatypes_json=JSONSerializer().serialize(datatypes, exclude=["iconclass", "modulename", "classname"]),
            map_layers=map_layers,
            map_markers=map_markers,
            map_sources=map_sources,
            geocoding_providers=geocoding_providers,
            user_is_reviewer=json.dumps(user_is_reviewer),
            user_can_delete_resource=can_delete,
            creator=json.dumps(creator),
            user_created_instance=json.dumps(user_created_instance),
            report_templates=templates,
            templates_json=JSONSerializer().serialize(templates, sort_keys=False, exclude=["name", "description"]),
            graph_json=JSONSerializer().serialize(graph),
            is_system_settings=is_system_settings,
        )

        context["nav"]["title"] = ""
        context["nav"]["menu"] = nav_menu
        if resourceid == settings.RESOURCE_INSTANCE_ID:
            context["nav"]["help"] = {"title": _("Managing System Settings"), "template": "system-settings-help"}
        else:
            context["nav"]["help"] = {"title": _("Using the Resource Editor"), "template": "resource-editor-help"}

        return render(request, view_template, context)
示例#28
0
    def get(self, request):
        saved_searches = JSONSerializer().serialize(settings.SAVED_SEARCHES)
        map_layers = models.MapLayer.objects.all()
        map_markers = models.MapMarker.objects.all()
        map_sources = models.MapSource.objects.all()
        date_nodes = models.Node.objects.filter(Q(datatype='date')
                                                | Q(datatype='edtf'),
                                                graph__isresource=True,
                                                graph__isactive=True)
        resource_graphs = models.GraphModel.objects.exclude(
            pk=settings.SYSTEM_SETTINGS_RESOURCE_MODEL_ID).exclude(
                isresource=False).exclude(isactive=False)
        searchable_datatypes = [
            d.pk for d in models.DDataType.objects.filter(issearchable=True)
        ]
        searchable_nodes = models.Node.objects.filter(
            graph__isresource=True,
            graph__isactive=True,
            datatype__in=searchable_datatypes,
            issearchable=True)
        resource_cards = models.CardModel.objects.filter(
            graph__isresource=True, graph__isactive=True)
        datatypes = models.DDataType.objects.all()
        geocoding_providers = models.Geocoder.objects.all()
        # only allow cards that the user has permission to read
        searchable_cards = []
        for card in resource_cards:
            if request.user.has_perm('read_nodegroup', card.nodegroup):
                searchable_cards.append(card)

        # only allow date nodes that the user has permission to read
        searchable_date_nodes = []
        for node in date_nodes:
            if request.user.has_perm('read_nodegroup', node.nodegroup):
                searchable_date_nodes.append(node)

        context = self.get_context_data(
            resource_cards=JSONSerializer().serialize(searchable_cards),
            searchable_nodes=JSONSerializer().serialize(searchable_nodes),
            saved_searches=saved_searches,
            date_nodes=searchable_date_nodes,
            map_layers=map_layers,
            map_markers=map_markers,
            map_sources=map_sources,
            geocoding_providers=geocoding_providers,
            main_script='views/search',
            resource_graphs=resource_graphs,
            datatypes=datatypes,
            datatypes_json=JSONSerializer().serialize(datatypes),
            user_is_reviewer=request.user.groups.filter(
                name='Resource Reviewer').exists())

        graphs = JSONSerializer().serialize(
            context['resource_graphs'],
            exclude=[
                'functions', 'author', 'deploymentdate', 'deploymentfile',
                'version', 'subtitle', 'description',
                'disable_instance_creation', 'ontology_id'
            ])
        context['graphs'] = graphs
        context['graph_models'] = models.GraphModel.objects.all().exclude(
            graphid=settings.SYSTEM_SETTINGS_RESOURCE_MODEL_ID)
        context['nav']['title'] = _('Search')
        context['nav']['icon'] = 'fa-search'
        context['nav']['search'] = False
        context['nav']['help'] = {
            'title': _('Searching the Database'),
            'template': 'search-help',
        }

        return render(request, 'views/search.htm', context)
示例#29
0
    def get(self, request, resourceid=None):
        resource = Resource.objects.get(pk=resourceid)

        resource_models = (
            models.GraphModel.objects.filter(isresource=True).exclude(isactive=False).exclude(pk=settings.SYSTEM_SETTINGS_RESOURCE_MODEL_ID)
        )

        if strtobool(request.GET.get("json", "false")):
            get_params = request.GET.copy()
            get_params.update({"paginate": "false"})
            request.GET = get_params

            related_resources_response = RelatedResourcesView().get(request, resourceid)
            related_resources = json.loads(related_resources_response.content)

            related_resources_summary = self._generate_related_resources_summary(
                related_resources=related_resources["related_resources"],
                resource_relationships=related_resources["resource_relationships"],
                resource_models=resource_models,
            )
        else:
            related_resources_summary = {}

            for resource_model in resource_models:
                get_params = request.GET.copy()
                get_params.update({"resourceinstance_graphid": str(resource_model.graphid)})
                request.GET = get_params

                related_resources_response = RelatedResourcesView().get(request, resourceid).content
                related_resources_summary[str(resource_model.pk)] = json.loads(related_resources_response)

        permitted_tiles = []
        perm = "read_nodegroup"

        for tile in Tile.objects.filter(resourceinstance=resource).order_by("sortorder"):
            if request.user.has_perm(perm, tile.nodegroup):
                tile.filter_by_perm(request.user, perm)
                permitted_tiles.append(tile)

        if strtobool(request.GET.get("json", "false")) and strtobool(request.GET.get("exclude_graph", "false")):
            return JSONResponse(
                {
                    "tiles": permitted_tiles,
                    "related_resources": related_resources_summary,
                    "displayname": resource.displayname,
                    "resourceid": resourceid,
                }
            )

        datatypes = models.DDataType.objects.all()
        graph = Graph.objects.get(graphid=resource.graph_id)

        permitted_cards = []

        for card in Card.objects.filter(graph_id=resource.graph_id).order_by("sortorder"):
            if request.user.has_perm(perm, card.nodegroup):
                card.filter_by_perm(request.user, perm)
                permitted_cards.append(card)

        cardwidgets = [
            widget for widgets in [card.cardxnodexwidget_set.order_by("sortorder").all() for card in permitted_cards] for widget in widgets
        ]

        if strtobool(request.GET.get("json", "false")) and not strtobool(request.GET.get("exclude_graph", "false")):
            return JSONResponse(
                {
                    "datatypes": datatypes,
                    "cards": permitted_cards,
                    "tiles": permitted_tiles,
                    "graph": graph,
                    "related_resources": related_resources_summary,
                    "displayname": resource.displayname,
                    "resourceid": resourceid,
                    "cardwidgets": cardwidgets,
                }
            )

        widgets = models.Widget.objects.all()
        templates = models.ReportTemplate.objects.all()
        card_components = models.CardComponent.objects.all()

        try:
            map_layers = models.MapLayer.objects.all()
            map_markers = models.MapMarker.objects.all()
            map_sources = models.MapSource.objects.all()
            geocoding_providers = models.Geocoder.objects.all()
        except AttributeError:
            raise Http404(_("No active report template is available for this resource."))

        context = self.get_context_data(
            main_script="views/resource/report",
            report_templates=templates,
            templates_json=JSONSerializer().serialize(templates, sort_keys=False, exclude=["name", "description"]),
            card_components=card_components,
            card_components_json=JSONSerializer().serialize(card_components),
            cardwidgets=JSONSerializer().serialize(cardwidgets),
            tiles=JSONSerializer().serialize(permitted_tiles, sort_keys=False),
            cards=JSONSerializer().serialize(
                permitted_cards,
                sort_keys=False,
                exclude=["is_editable", "description", "instructions", "helpenabled", "helptext", "helptitle", "ontologyproperty"],
            ),
            datatypes_json=JSONSerializer().serialize(
                datatypes, exclude=["modulename", "issearchable", "configcomponent", "configname", "iconclass"]
            ),
            geocoding_providers=geocoding_providers,
            related_resources=JSONSerializer().serialize(related_resources_summary, sort_keys=False),
            widgets=widgets,
            map_layers=map_layers,
            map_markers=map_markers,
            map_sources=map_sources,
            graph_id=graph.graphid,
            graph_name=graph.name,
            graph_json=JSONSerializer().serialize(
                graph,
                sort_keys=False,
                exclude=[
                    "functions",
                    "relatable_resource_model_ids",
                    "domain_connections",
                    "edges",
                    "is_editable",
                    "description",
                    "iconclass",
                    "subtitle",
                    "author",
                ],
            ),
            resourceid=resourceid,
            version=__version__,
            hide_empty_nodes=settings.HIDE_EMPTY_NODES_IN_REPORT,
        )

        if graph.iconclass:
            context["nav"]["icon"] = graph.iconclass
        context["nav"]["title"] = graph.name
        context["nav"]["res_edit"] = True
        context["nav"]["print"] = True
        context["nav"]["print"] = True

        return render(request, "views/resource/report.htm", context)
示例#30
0
    def setUpClass(cls):
        delete_terms_index()
        delete_concepts_index()
        delete_search_index()

        prepare_terms_index(create=True)
        prepare_concepts_index(create=True)
        prepare_search_index(create=True)

        cls.client = Client()
        cls.client.login(username="******", password="******")

        models.ResourceInstance.objects.all().delete()
        with open(
                os.path.join(
                    "tests/fixtures/resource_graphs/Search Test Model.json"),
                "rU") as f:
            archesfile = JSONDeserializer().deserialize(f)
        ResourceGraphImporter(archesfile["graph"])

        cls.search_model_graphid = "d291a445-fa5f-11e6-afa8-14109fd34195"
        cls.search_model_cultural_period_nodeid = "7a182580-fa60-11e6-96d1-14109fd34195"
        cls.search_model_creation_date_nodeid = "1c1d05f5-fa60-11e6-887f-14109fd34195"
        cls.search_model_destruction_date_nodeid = "e771b8a1-65fe-11e7-9163-14109fd34195"
        cls.search_model_name_nodeid = "2fe14de3-fa61-11e6-897b-14109fd34195"
        cls.search_model_sensitive_info_nodeid = "57446fae-65ff-11e7-b63a-14109fd34195"
        cls.search_model_geom_nodeid = "3ebc6785-fa61-11e6-8c85-14109fd34195"

        cls.user = User.objects.create_user(
            "unpriviliged_user", "*****@*****.**", "test")
        cls.user.groups.add(Group.objects.get(name="Guest"))

        nodegroup = models.NodeGroup.objects.get(
            pk=cls.search_model_destruction_date_nodeid)
        assign_perm("no_access_to_nodegroup", cls.user, nodegroup)

        # Add a concept that defines a min and max date
        concept = {
            "id":
            "00000000-0000-0000-0000-000000000001",
            "legacyoid":
            "ARCHES",
            "nodetype":
            "ConceptScheme",
            "values": [],
            "subconcepts": [{
                "values": [
                    {
                        "value": "Mock concept",
                        "language": "en-US",
                        "category": "label",
                        "type": "prefLabel",
                        "id": "",
                        "conceptid": ""
                    },
                    {
                        "value": "1950",
                        "language": "en-US",
                        "category": "note",
                        "type": "min_year",
                        "id": "",
                        "conceptid": ""
                    },
                    {
                        "value": "1980",
                        "language": "en-US",
                        "category": "note",
                        "type": "max_year",
                        "id": "",
                        "conceptid": ""
                    },
                ],
                "relationshiptype":
                "hasTopConcept",
                "nodetype":
                "Concept",
                "id":
                "",
                "legacyoid":
                "",
                "subconcepts": [],
                "parentconcepts": [],
                "relatedconcepts": [],
            }],
        }

        post_data = JSONSerializer().serialize(concept)
        content_type = "application/x-www-form-urlencoded"
        response = cls.client.post(
            reverse(
                "concept",
                kwargs={"conceptid": "00000000-0000-0000-0000-000000000001"}),
            post_data, content_type)
        response_json = json.loads(response.content)
        valueid = response_json["subconcepts"][0]["values"][0]["id"]
        cls.conceptid = response_json["subconcepts"][0]["id"]

        # add resource instance with only a cultural period defined
        cls.cultural_period_resource = Resource(
            graph_id=cls.search_model_graphid)
        tile = Tile(data={cls.search_model_cultural_period_nodeid: [valueid]},
                    nodegroup_id=cls.search_model_cultural_period_nodeid)
        cls.cultural_period_resource.tiles.append(tile)
        cls.cultural_period_resource.save()

        # add resource instance with a creation and destruction date defined
        cls.date_resource = Resource(graph_id=cls.search_model_graphid)
        tile = Tile(data={cls.search_model_creation_date_nodeid: "1941-01-01"},
                    nodegroup_id=cls.search_model_creation_date_nodeid)
        cls.date_resource.tiles.append(tile)
        tile = Tile(
            data={cls.search_model_destruction_date_nodeid: "1948-01-01"},
            nodegroup_id=cls.search_model_destruction_date_nodeid)
        cls.date_resource.tiles.append(tile)
        tile = Tile(data={cls.search_model_name_nodeid: "testing 123"},
                    nodegroup_id=cls.search_model_name_nodeid)
        cls.date_resource.tiles.append(tile)
        cls.date_resource.save()

        # add resource instance with a creation date and a cultural period defined
        cls.date_and_cultural_period_resource = Resource(
            graph_id=cls.search_model_graphid)
        tile = Tile(data={cls.search_model_creation_date_nodeid: "1942-01-01"},
                    nodegroup_id=cls.search_model_creation_date_nodeid)
        cls.date_and_cultural_period_resource.tiles.append(tile)
        tile = Tile(data={cls.search_model_cultural_period_nodeid: [valueid]},
                    nodegroup_id=cls.search_model_cultural_period_nodeid)
        cls.date_and_cultural_period_resource.tiles.append(tile)
        cls.date_and_cultural_period_resource.save()

        # add resource instance with with no dates or periods defined
        cls.name_resource = Resource(graph_id=cls.search_model_graphid)
        tile = Tile(data={cls.search_model_name_nodeid: "some test name"},
                    nodegroup_id=cls.search_model_name_nodeid)
        cls.name_resource.tiles.append(tile)
        geom = {
            "type":
            "FeatureCollection",
            "features": [{
                "geometry": {
                    "type": "Point",
                    "coordinates": [0, 0]
                },
                "type": "Feature",
                "properties": {}
            }],
        }
        tile = Tile(data={cls.search_model_geom_nodeid: geom},
                    nodegroup_id=cls.search_model_geom_nodeid)
        cls.name_resource.tiles.append(tile)
        cls.name_resource.save()

        # add delay to allow for indexes to be updated
        time.sleep(1)