diff --git a/core/etl/loader/subscriber.py b/core/etl/loader/subscriber.py index e626bb896fe7f3fba3e3b1855e6544ec92da13a9..506b352e8cd4904f412849d5c9f778188c2e5827 100644 --- a/core/etl/loader/subscriber.py +++ b/core/etl/loader/subscriber.py @@ -1,20 +1,13 @@ # -*- coding: utf-8 -*- # ---------------------------------------------------------------------- -# Subscriner loader +# Subscriber loader # ---------------------------------------------------------------------- # Copyright (C) 2007-2016 The NOC Project # See LICENSE for details # ---------------------------------------------------------------------- -# Python modules -import operator - -# Third-party modules -import cachetools - # NOC modules from .base import BaseLoader -from noc.crm.models.subscriberprofile import SubscriberProfile from noc.crm.models.subscriber import Subscriber @@ -35,15 +28,31 @@ class SubscriberLoader(BaseLoader): "tech_contact_phone", ] - _profile_cache = {} - - @classmethod - @cachetools.cachedmethod(operator.attrgetter("_profile_cache")) - def get_profile(cls, name): - return SubscriberProfile.objects.get(name=name) - - def clean(self, row): - d = super(SubscriberLoader, self).clean(row) - if "profile" in d: - d["profile"] = self.get_profile(d["profile"]) - return d + mapped_fields = { + "profile": "subscriberprofile", + } + + discard_deferred = True + + def find_object(self, v): + """ + Find object by remote system/remote id + :param v: + :return: + """ + if not v.get("remote_system") or not v.get("remote_id"): + self.logger.warning("RS or RID not found") + return None + if not hasattr(self, "_subscriber_remote_ids"): + self.logger.info("Filling service collection") + coll = Subscriber._get_collection() + self._subscriber_remote_ids = { + c["remote_id"]: c["_id"] + for c in coll.find( + {"remote_system": v["remote_system"].id, "remote_id": {"$exists": True}}, + {"remote_id": 1, "_id": 1}, + ) + } + if v["remote_id"] in self._subscriber_remote_ids: + return Subscriber.objects.get(id=self._subscriber_remote_ids[v["remote_id"]]) + return None diff --git a/core/etl/loader/subscriberprofile.py b/core/etl/loader/subscriberprofile.py new file mode 100644 index 0000000000000000000000000000000000000000..b01f0c6ff9a312ce2f4f3ee00eb15e6e32d64ebe --- /dev/null +++ b/core/etl/loader/subscriberprofile.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# ---------------------------------------------------------------------- +# SubscriberProfile loader +# ---------------------------------------------------------------------- +# Copyright (C) 2007-2016 The NOC Project +# See LICENSE for details +# ---------------------------------------------------------------------- + +# Python modules +from __future__ import absolute_import + +# NOC modules +from .base import BaseLoader +from noc.crm.models.subscriberprofile import SubscriberProfile +from noc.wf.models.workflow import Workflow + +DEFAULT_WOKFLOW_NAME = "Default Resource" + + +class SubscriberProfileLoader(BaseLoader): + """ + Subscriber Profile loader + """ + + name = "subscriberprofile" + model = SubscriberProfile + fields = ["id", "name", "description", "workflow"] + + def clean(self, row): + d = super(SubscriberProfileLoader, self).clean(row) + if "workflow" in d: + d["workflow"] = Workflow.objects.get(name=d["workflow"]) + else: + d["workflow"] = Workflow.objects.get(name=DEFAULT_WOKFLOW_NAME) + return d diff --git a/core/etl/remotesystem/base.py b/core/etl/remotesystem/base.py index 0a2878debf397d88f535bcca36a9c5542bfcdabf..48d51e57f907d2a6257bd2aa53571a381e5df7bf 100644 --- a/core/etl/remotesystem/base.py +++ b/core/etl/remotesystem/base.py @@ -30,6 +30,7 @@ class BaseRemoteSystem(object): "ttsystem", "managedobject", "link", + "subscriberprofile", "subscriber", "serviceprofile", "service", diff --git a/crm/models/subscriber.py b/crm/models/subscriber.py index ad9a2081077d6904ad19914bd7b36c6f66fa66db..2a7981cd4f1f3966a6b0cabd2a8d5cb41a3b6c96 100644 --- a/crm/models/subscriber.py +++ b/crm/models/subscriber.py @@ -23,11 +23,13 @@ from noc.wf.models.state import State from noc.project.models.project import Project from noc.core.wf.decorator import workflow from noc.core.bi.decorator import bi_sync +from noc.core.model.decorator import on_delete_check id_lock = Lock() @bi_sync +@on_delete_check(check=[("sa.Service", "subscriber")]) @workflow class Subscriber(Document): meta = { diff --git a/main/models/remotesystem.py b/main/models/remotesystem.py index dd9b881a1fc1975587c917f8454b68b773a71dd6..4e66679b03fce308c6bcc02fde2bdd7878665382 100644 --- a/main/models/remotesystem.py +++ b/main/models/remotesystem.py @@ -93,6 +93,7 @@ class RemoteSystem(Document): enable_service = BooleanField() enable_serviceprofile = BooleanField() enable_subscriber = BooleanField() + enable_subscriberprofile = BooleanField() enable_resourcegroup = BooleanField() enable_ttsystem = BooleanField() # Usage statistics diff --git a/ui/web/main/remotesystem/Application.js b/ui/web/main/remotesystem/Application.js index 7dd219ec6226de2ddbf10d48e7e7c52f5d92779b..4f795684f6d1d20e821eacae2f07d31694cabf6b 100644 --- a/ui/web/main/remotesystem/Application.js +++ b/ui/web/main/remotesystem/Application.js @@ -118,6 +118,11 @@ Ext.define("NOC.main.remotesystem.Application", { xtype: "checkbox", boxLabel: __("Subscriber") }, + { + name: "enable_subscriberprofile", + xtype: "checkbox", + boxLabel: __("Subscriber Profile") + }, { name: "enable_resourcegroup", xtype: "checkbox", diff --git a/ui/web/main/remotesystem/Model.js b/ui/web/main/remotesystem/Model.js index 6a02d35ebb193a7390c0926465d3e81e09d8f3e9..7533c8b0cd960beebdd30e6f0fda7ac06bab98d9 100644 --- a/ui/web/main/remotesystem/Model.js +++ b/ui/web/main/remotesystem/Model.js @@ -81,6 +81,10 @@ Ext.define("NOC.main.remotesystem.Model", { name: "enable_subscriber", type: "boolean" }, + { + name: "enable_subscriberprofile", + type: "boolean" + }, { name: "enable_resourcegroup", type: "boolean"