Esempio n. 1
0
 def __init__(self, verbose_name=None, name=None, auto=True, version=1, node=None, clock_seq=None, namespace=None, **kwargs):
     kwargs['max_length'] = 36
     self.auto = auto
     self.version = version
     if version==1:
         self.node, self.clock_seq = node, clock_seq
     elif version==3 or version==5:
         self.namespace, self.name = namespace, name
     StringField.__init__(self, verbose_name, name, **kwargs)
Esempio n. 2
0
class Building(Document):
    meta = {
        "collection": "noc.buildings",
        "allow_inheritance": False,
        "indexes": ["adm_division", "data", "sort_order"]
    }
    # Administrative division
    adm_division = PlainReferenceField(Division)

    status = StringField(choices=[("P", "PROJECT"), ("B", "BUILDING"),
                                  ("R", "READY"), ("E", "EVICTED"),
                                  ("D", "DEMOLISHED")],
                         default="R")
    ## Total homes
    homes = IntField()
    ## Maximal amount of floors
    floors = IntField()
    #
    entrances = ListField(EmbeddedDocumentField(Entrance))
    #
    has_cellar = BooleanField()
    has_attic = BooleanField()
    #
    postal_code = StringField()
    # Type
    is_administrative = BooleanField(default=False)
    is_habitated = BooleanField(default=False)
    #
    data = DictField()
    #
    start_date = DateTimeField()
    end_date = DateTimeField()
    # Internal field for sorting
    # Filled by primary address trigger
    sort_order = StringField()

    @classmethod
    def update_floors(cls, sender, document, **kwargs):
        """
        Update floors
        """

    @property
    def primary_address(self):
        # Try primary address first
        pa = Address.objects.filter(building=self.id, is_primary=True).first()
        if pa:
            return pa
        # Fallback to first address found
        return Address.objects.filter(building=self.id).first()

    def fill_entrances(self,
                       first_entrance=1,
                       first_home=1,
                       n_entrances=1,
                       first_floor=1,
                       last_floor=1,
                       homes_per_entrance=1):
        e_home = first_home
        for e in range(first_entrance, first_entrance + n_entrances):
            self.entrances += [
                Entrance(number=str(e),
                         first_floor=str(first_floor),
                         last_floor=str(last_floor),
                         first_home=str(e_home),
                         last_home=str(e_home + homes_per_entrance - 1))
            ]
            e_home += homes_per_entrance
        self.save()
Esempio n. 3
0
class George_s(Document):
    meta = {'collection': 'George'}
    full_name = StringField(required=True)
    tweet_text= StringField(required=True)
    no_of_replies = StringField(required=True)
    number_of_likes = StringField(required=True)
    hashtags= StringField(required=True)
    username = StringField(required=True)
    no_of_retweets = StringField(required=True)
    twitter_url= StringField(required=True)
    call_to_action = StringField(required=True)
    no_of_hashtags = StringField(required=True)
    mentions= StringField(required=True)
    tweet_time = StringField(required=True)
    no_of_mentions = StringField(required=True)
    sentiment = StringField(required=True)
Esempio n. 4
0
class Hero(Document):
    name = StringField(required=True)
    description = StringField()
    release_date = DateTimeField()
    blizz_role = StringField()
    bans = DictField()
    can_tank = BooleanField(default=False)
    can_solo_heal = BooleanField(default=False)
    can_heal_ally = BooleanField(default=False)
    can_heal_self = BooleanField(default=False)
    can_shield_self = BooleanField(default=False)
    can_shield_ally = BooleanField(default=False)
    can_solo_lane = BooleanField(default=False)
    has_aoe_heal = BooleanField(default=False)
    has_dot_heal = BooleanField(default=False)
    has_percent_heal = BooleanField(default=False)
    has_aoe_damage = BooleanField(default=False)
    has_dot_damage = BooleanField(default=False)
    has_percent_damage = BooleanField(default=False)
    has_waveclear = BooleanField(default=False)
    has_global = BooleanField(default=False)
    has_stun = BooleanField(default=False)
    has_root = BooleanField(default=False)
    has_slow = BooleanField(default=False)
    has_silence = BooleanField(default=False)
    has_blind = BooleanField(default=False)
    has_sleep = BooleanField(default=False)
    has_polymorph = BooleanField(default=False)
    has_knockback = BooleanField(default=False)
    has_stasis = BooleanField(default=False)
    has_time_stop = BooleanField(default=False)
    has_parry = BooleanField(default=False)
    has_unrevealable = BooleanField(default=False)
    has_reveal = BooleanField(default=False)
    has_stealth_self = BooleanField(default=False)
    has_stealth_ally = BooleanField(default=False)
    has_evade_self = BooleanField(default=False)
    has_evade_ally = BooleanField(default=False)
    has_unstoppable_self = BooleanField(default=False)
    has_unstoppable_ally = BooleanField(default=False)
    has_protected_self = BooleanField(default=False)
    has_protected_ally = BooleanField(default=False)
    has_unkillable_self = BooleanField(default=False)
    has_unkillable_ally = BooleanField(default=False)
    has_invulnerable_self = BooleanField(default=False)
    has_invulnerable_ally = BooleanField(default=False)
    has_aa_speedup_ally = BooleanField(default=False)
    has_aa_speedup_self = BooleanField(default=False)
    has_move_speedup_ally = BooleanField(default=False)
    has_move_speedup_self = BooleanField(default=False)
    has_aa_dpsup_ally = BooleanField(default=False)
    has_aa_dpsup_self = BooleanField(default=False)
    has_crits_ally = BooleanField(default=False)
    has_crits_self = BooleanField(default=False)
    has_ability_dpsup_ally = BooleanField(default=False)
    has_ability_dpsup_self = BooleanField(default=False)

    def __repr__(self):
        return '{}'.format(self.name)

    def get_hero_popularity(self):
        popularity = {'players': 0, 'total_level': 0}
        for player_hero in PlayerHero.objects(hero=self):
            if player_hero.mode not in popularity:
                popularity[player_hero.mode] = {
                    'wins': 0,
                    'losses': 0,
                    'bans': self.bans[player_hero.mode]
                }
            popularity[player_hero.mode][
                'losses'] += player_hero.games_played - player_hero.games_won
            popularity[player_hero.mode]['wins'] += player_hero.games_won
            popularity['players'] += 1
            popularity['total_level'] += player_hero.level
        return popularity

    def get_hero_popularity_for_date_range(self,
                                           start_date,
                                           end_date=None,
                                           min_level=1,
                                           mode=None):
        from server.db.replay import Replay
        popularity = {}
        replays_by_result = Replay.get_replays_by_result_for_hero_mode_and_date_range(
            self, start_date, end_date, mode, min_level)
        for result, replays in replays_by_result.items():
            for replay in replays:
                if replay.mode not in popularity:
                    popularity[replay.mode] = {
                        'wins': 0,
                        'losses': 0,
                        'bans': 0
                    }
                popularity[replay.mode][result] += 1
        return popularity

    def get_talents_details(self):
        return {}

    def get_hero_details(self):
        hero_details = {
            'talents': self.get_talents_details(),
            'popularity': self.get_hero_popularity()
        }
        return hero_details
Esempio n. 5
0
class Block(EmbeddedDocument):
    type = StringField(required=True)
    data = DictField(required=True)
Esempio n. 6
0
class ChildRegisteredAfter(Document):

    meta = {'collection': 'test_child_after_reference'}
    parent = ReferenceField(ParentWithRelationship)
    name = StringField()
Esempio n. 7
0
class Vendor(Document):
    """
    Equipment vendor
    """

    meta = {
        "collection": "noc.vendors",
        "strict": False,
        "auto_create_index": False,
        "json_collection": "inv.vendors",
        "json_unique_fields": ["name", "code"],
    }
    # Short vendor name, included as first part of platform
    name = StringField(unique=True)
    # Full vendor name
    full_name = StringField()
    # Unique id
    uuid = UUIDField(binary=True)
    # List of vendor codes to be searched via .get_by_code()
    code = ListField(StringField(), unique=True)
    # Vendor's site
    site = URLField(required=False)
    # Object id in BI
    bi_id = LongField(unique=True)

    _id_cache = cachetools.TTLCache(1000, ttl=60)
    _bi_id_cache = cachetools.TTLCache(1000, ttl=60)
    _code_cache = cachetools.TTLCache(1000, ttl=60)
    _ensure_cache = cachetools.TTLCache(1000, ttl=60)

    def __str__(self):
        return self.name

    @classmethod
    @cachetools.cachedmethod(operator.attrgetter("_id_cache"),
                             lock=lambda _: id_lock)
    def get_by_id(cls, id):
        return Vendor.objects.filter(id=id).first()

    @classmethod
    @cachetools.cachedmethod(operator.attrgetter("_bi_id_cache"),
                             lock=lambda _: id_lock)
    def get_by_bi_id(cls, id):
        return Vendor.objects.filter(bi_id=id).first()

    @classmethod
    def _get_by_code(cls, code):
        """
        Uncached version of get_by_code
        :param code:
        :return:
        """
        code = code.upper()
        return Vendor.objects.filter(code=code).first()

    @classmethod
    @cachetools.cachedmethod(operator.attrgetter("_code_cache"),
                             lock=lambda _: id_lock)
    def get_by_code(cls, code):
        return cls._get_by_code(code)

    def clean(self):
        # Convert code to list
        if isinstance(self.code, six.string_types):
            self.code = [self.code]
        # Uppercase code
        self.code = [c.upper() for c in self.code]
        # Fill full name if not set
        if not self.full_name:
            self.full_name = self.name
        #
        super(Vendor, self).clean()

    def on_save(self):
        if not hasattr(self,
                       "_changed_fields") or "name" in self._changed_fields:
            from .platform import Platform

            for p in Platform.objects.filter(vendor=self.id):
                p.save()  # Rebuild full name

    def to_json(self):
        return to_json(
            {
                "name": self.name,
                "$collection": self._meta["json_collection"],
                "full_name": self.full_name,
                "code": self.code,
                "site": self.site,
                "uuid": self.uuid,
            },
            order=["name", "uuid", "full_name", "code", "site"],
        )

    def get_json_path(self):
        return "%s.json" % self.name

    @classmethod
    @cachetools.cachedmethod(operator.attrgetter("_ensure_cache"),
                             lock=lambda _: id_lock)
    def ensure_vendor(cls, code):
        """
        Get or create vendor by code
        :param code:
        :return:
        """
        while True:
            vendor = Vendor._get_by_code(code)
            if vendor:
                return vendor
            try:
                vendor = Vendor(name=code,
                                full_name=code,
                                code=[code],
                                uuid=uuid.uuid4())
                vendor.save()
                return vendor
            except NotUniqueError:
                pass  # Already created by concurrent process, reread
class UserModel(Document):
    meta = {"collection": "Users"}
    username = StringField(required=True, unique=True)
    is_admin = BooleanField(default=False)
    email = StringField(default="")
Esempio n. 9
0
class HostDO(EmbeddedDocument):
    ip = StringField(max_length=256)
    hostname = StringField(max_length=256)

    def __repr__(self):
        return '<Host %r>' % self.hostname
Esempio n. 10
0
class lti(Document):
    user = StringField()
    payload = DictField()
Esempio n. 11
0
class OneTimeToken(Document):
    user = StringField()
    token = StringField()
Esempio n. 12
0
class MntTask(Document):
    """全自动计划任务"""

    TASK_TYPE_CHOICES = ((0, '例行任务'), (1, '快速任务-添加宝贝'), (2, '快速任务-修改限价'),
                         (3, '命令生成任务'), (4, '快速任务-加大/减小投入'))
    STATUS_CHOICES = (('deactive', '未激活'), ('ready', '准备中'),
                      ('allocated', '已分配'), ('doing', '执行中'),
                      ('successed', '执行成功'), ('failed', '执行失败'), ('paused',
                                                                  '优化暂停'))

    shop_id = IntField(verbose_name="店铺ID", required=True)
    campaign_id = IntField(verbose_name="推广计划ID", required=True)
    create_time = DateTimeField(verbose_name="创建时间",
                                default=datetime.datetime.now)
    task_type = IntField(verbose_name='任务类型',
                         default=0,
                         choices=TASK_TYPE_CHOICES)
    mnt_type = IntField(verbose_name="监控类型",
                        choices=MNT_TYPE_CHOICES,
                        default=1)
    start_time = DateTimeField(verbose_name="执行时间", default=None)
    end_time = DateTimeField(verbose_name="结束时间", default=None)
    status = StringField(verbose_name="任务执行时间",
                         default='ready',
                         choices=STATUS_CHOICES)
    failed_count = IntField(verbose_name="任务失败次数", default=0)
    opt_list = ListField(
        verbose_name="任务执行操作列表", default=[]
    )  # 形如:[{'func':'add_keywords', 'args':'{}'},{'func':'optimize_keywords', 'args':'{}'}], 由json序列化
    reporter = ObjectIdField(verbose_name="任务报告者", default=None)

    meta = {
        'db_alias': "mnt-db",
        'collection': 'mnt_task',
        'indexes': ['shop_id', 'campaign_id', 'task_type']
    }

    @property
    def mnt_campaign(self):
        """获取当前任务对应的计划"""
        if not hasattr(self, '_mnt_campaign'):
            try:
                mnt_camp = MntCampaign.objects.get(
                    shop_id=self.shop_id, campaign_id=self.campaign_id)
            except DoesNotExist:
                mnt_camp = None
            self._mnt_campaign = mnt_camp
        return self._mnt_campaign

    def is_runnable(self, is_force=False):  #
        """检查是否可以执行:
        1.是否有api权限
        2.对应的全自动计划,且全计划未暂停,自动计划是托管中
        3.失败次数超过3次,且非强制执行
        """
        dler = Downloader.objects.get(shop_id=self.shop_id)
        if not dler.tapi:  # api不可用
            return False, 'not_callable'
        if not self.mnt_campaign:  # 托管计划不存在
            return False, 'mnt_camp_not_found'

        # return True, 'OK'

        if self.task_type == 0:  # 只检查例行任务,因为快速任务是用户手动触发的,需要立即执行
            if not self.mnt_campaign.is_active:  # 托管计划被暂停
                return False, 'mnt_camp_not_active'
            account = Account.objects.get(shop_id=self.shop_id)
            if account.is_keep_stop:
                return False, 'shop_banlance_is_less'

        if self.failed_count >= 3 and (not is_force):  # 后台执行失败超过3次
            return False, 'failed_too_much'

        return True, 'OK'

    def save_log(self, check_desc):
        try:
            UploadRecord.objects.create(shop_id=self.shop_id,
                                        campaign_id=self.campaign_id,
                                        op_type=1,
                                        data_type=113,
                                        detail_list=[check_desc],
                                        opter=3)
        except Exception, e:
            log.error(
                'save mnt log error, shop_id=%s, camp_id=%s, desc=%s, e=%s' %
                (self.shop_id, self.campaign_id, check_desc, e))
        return
Esempio n. 13
0
class Service(Document):
    meta = {
        "collection": "noc.services",
        "strict": False,
        "auto_create_index": False,
        "indexes": ["subscriber", "managed_object", "parent", "order_id"],
    }
    profile = ReferenceField(ServiceProfile, required=True)
    # Creation timestamp
    ts = DateTimeField(default=datetime.datetime.now)
    # Logical state of service
    logical_status = StringField(
        choices=[
            ("P", "Planned"),
            ("p", "Provisioning"),
            ("T", "Testing"),
            ("R", "Ready"),
            ("S", "Suspended"),
            ("r", "Removing"),
            ("C", "Closed"),
            ("U", "Unknown"),
        ],
        default="U",
    )
    logical_status_start = DateTimeField()
    # Parent service
    parent = ReferenceField("self", required=False)
    # Subscriber information
    subscriber = ReferenceField(Subscriber)
    description = StringField()
    #
    agreement_id = StringField()
    # Order Fulfillment order id
    order_id = StringField()
    stage_id = StringField()
    stage_name = StringField()
    stage_start = DateTimeField()
    # Billing contract number
    account_id = StringField()
    # Connection address
    address = StringField()
    # For port services
    managed_object = ForeignKeyField(ManagedObject)
    # NRI port id, converted by portmapper to native name
    nri_port = StringField()
    # CPE information
    cpe_serial = StringField()
    cpe_mac = StringField()
    cpe_model = StringField()
    cpe_group = StringField()
    # Capabilities
    caps = ListField(EmbeddedDocumentField(CapsItem))
    # Integration with external NRI and TT systems
    # Reference to remote system object has been imported from
    remote_system = ReferenceField(RemoteSystem)
    # Object id in remote system
    remote_id = StringField()
    # Object id in BI
    bi_id = LongField(unique=True)
    # Labels
    labels = ListField(StringField())
    effective_labels = ListField(StringField())

    def __str__(self):
        return str(self.id) if self.id else "new service"

    def on_delete(self):
        if self.nri_port:
            self.unbind_interface()

    def on_save(self):
        if not hasattr(
                self, "_changed_fields") or "nri_port" in self._changed_fields:
            self.unbind_interface()
        if not hasattr(self,
                       "_changed_fields") or "parent" in self._changed_fields:
            self._refresh_managed_object()

    def _refresh_managed_object(self):
        from noc.sa.models.servicesummary import ServiceSummary

        mo = self.get_managed_object()
        if mo:
            ServiceSummary.refresh_object(mo)

    def unbind_interface(self):
        from noc.inv.models.interface import Interface

        Interface._get_collection().update({"service": self.id},
                                           {"$unset": {
                                               "service": ""
                                           }})
        self._refresh_managed_object()

    def get_managed_object(self):
        r = self
        while r:
            if r.managed_object:
                return self.managed_object
            r = r.parent
        return None

    def get_caps(self) -> Dict[str, Any]:
        return CapsItem.get_caps(self.caps, self.profile.caps)

    @classmethod
    def can_set_label(cls, label):
        if label.enable_service:
            return True
        return False

    @classmethod
    def can_expose_label(cls, label):
        return False
Esempio n. 14
0
class CustomWord(Document):
    word = StringField(regex=f'^[a-z]{{{MIN_WORD_LENGTH},{MAX_WORD_LENGTH}}}$',
                       required=True)
    uuid = UUIDField(unique=True, required=True, default=uuid.uuid4)
Esempio n. 15
0
class Game(Document):
    uuid = UUIDField(unique=True, required=True, default=uuid.uuid4)
    word = StringField(regex=f'^[a-z]{{{MIN_WORD_LENGTH},{MAX_WORD_LENGTH}}}$',
                       required=True)
    status = StringField(min_length=3,
                         max_length=16,
                         default=STATUS_IN_PROGRESS,
                         choices=STATUS_CHOICES)
    updated_at = DateTimeField(default=datetime.datetime.utcnow)

    letters = EmbeddedDocumentListField('LetterGuessed')

    def __str__(self):
        return (f'{self.uuid}->{self.word}->{self.status}')

    @classmethod
    def pre_save(cls, sender, document, **kwargs):
        document.updated_at = datetime.datetime.utcnow()
        # update game status if needed
        if not document.is_over:
            if document.representation == document.word:
                document.status = STATUS_WON

            elif document.letters and document.last_letter.attempts_left == 0:
                document.status = STATUS_LOST

    @property
    def word_length(self):
        return len(self.word)

    @property
    def letters_guessed(self):
        return {l.letter for l in self.letters}

    @property
    def is_over(self):
        return self.status != STATUS_IN_PROGRESS

    @property
    def last_letter(self):
        return self.letters[-1]

    @property
    def representation(self):
        return ''.join(
            map(lambda l: l if l in self.letters_guessed else '_', self.word))

    def get_available_letters(self, letters_guessed=None):
        if letters_guessed is None:
            letters_guessed = self.letters_guessed

        return ''.join(
            map(lambda l: l
                if l not in letters_guessed else '', string.ascii_lowercase))

    def append_letter(self, letter, attempts_left, message):
        letter = LetterGuessed(letter=letter,
                               attempts_left=attempts_left,
                               message=message)
        self.letters.append(letter)
        self.save()
        return letter
Esempio n. 16
0
class Division(Document):
    meta = {
        "collection": "noc.divisions",
        "strict": False,
        "auto_create_index": False,
        "indexes": ["parent", "data", "name"],
    }
    # Division type
    type = StringField(default="A", choices=[("A", "Administrative")])
    #
    parent = PlainReferenceField("self")
    # Normalized name
    name = StringField()
    # street/town/city, etc
    short_name = StringField()
    #
    is_active = BooleanField(default=True)
    # Division level
    level = IntField()
    # Additional data
    # Depends on importer
    data = DictField()
    #
    start_date = DateTimeField()
    end_date = DateTimeField()
    #
    tags = ListField(StringField())

    def __str__(self):
        if self.short_name:
            return self.short_name
        else:
            return self.name

    def get_children(self):
        return Division.objects.filter(parent=self.id)

    @classmethod
    def get_top(cls, type="A"):
        return Division.objects.filter(parent__exists=False, type=type)

    def get_buildings(self):
        from .building import Building

        return Building.objects.filter(
            adm_division=self.id).order_by("sort_order")

    @classmethod
    def update_levels(cls):
        """
        Update divisions levels
        """
        def _update(root, level):
            if root.level != level:
                root.level = level
                root.save()
            for c in root.get_children():
                _update(c, level + 1)

        for d in cls.get_top():
            _update(d, 0)

    @property
    def full_path(self):
        r = [smart_text(self)]
        p = self.parent
        while p:
            r = [smart_text(p)] + r
            p = p.parent
        return " | ".join(r)
Esempio n. 17
0
class ParentWithRelationship(Document):

    meta = {'collection': 'test_parent_reference'}
    before_child = ListField(ReferenceField("ChildRegisteredBefore"))
    after_child = ListField(ReferenceField("ChildRegisteredAfter"))
    name = StringField()
Esempio n. 18
0
class InterfaceProfile(Document):
    """
    Interface SLA profile and settings
    """

    meta = {
        "collection": "noc.interface_profiles",
        "strict": False,
        "auto_create_index": False
    }
    name = StringField(unique=True)
    description = StringField()
    style = ForeignKeyField(Style, required=False)
    # Interface-level events processing
    link_events = StringField(
        required=True,
        choices=[
            ("I", "Ignore Events"),
            ("L", "Log events, do not raise alarms"),
            ("A", "Raise alarms"),
        ],
        default="A",
    )
    # Discovery settings
    discovery_policy = StringField(
        choices=[("I", "Ignore"), ("O", "Create new"), ("R", "Replace"),
                 ("C", "Add to cloud")],
        default="R",
    )
    # Collect mac addresses on interface
    mac_discovery_policy = StringField(choices=[("d", "Disabled"),
                                                ("m", "Management VLAN"),
                                                ("e", "Enabled")],
                                       default="d")
    # Collect and keep interface status
    status_discovery = BooleanField(default=False)
    #
    allow_lag_mismatch = BooleanField(default=False)
    # Send up/down notifications
    status_change_notification = ForeignKeyField(NotificationGroup,
                                                 required=False)
    # Interface profile metrics
    metrics = ListField(EmbeddedDocumentField(InterfaceProfileMetrics))
    # Alarm weight
    weight = IntField(default=0)
    # User network interface
    # MAC discovery can be restricted to UNI
    is_uni = BooleanField(default=False)
    # Allow automatic segmentation
    allow_autosegmentation = BooleanField(default=False)
    # Allow collecting metrics from subinterfaces
    allow_subinterface_metrics = BooleanField(default=False)
    # Validation policy
    interface_validation_policy = PlainReferenceField(
        InterfaceValidationPolicy)
    # Integration with external NRI and TT systems
    # Reference to remote system object has been imported from
    remote_system = ReferenceField(RemoteSystem)
    # Object id in remote system
    remote_id = StringField()
    # Object id in BI
    bi_id = LongField(unique=True)

    _id_cache = cachetools.TTLCache(maxsize=100, ttl=60)
    _name_cache = cachetools.TTLCache(maxsize=100, ttl=60)
    _bi_id_cache = cachetools.TTLCache(maxsize=100, ttl=60)
    _default_cache = cachetools.TTLCache(maxsize=100, ttl=60)
    _status_discovery_cache = cachetools.TTLCache(maxsize=100, ttl=60)

    DEFAULT_PROFILE_NAME = "default"

    def __str__(self):
        return self.name

    @classmethod
    @cachetools.cachedmethod(operator.attrgetter("_id_cache"),
                             lock=lambda _: id_lock)
    def get_by_id(cls, id):
        return InterfaceProfile.objects.filter(id=id).first()

    @classmethod
    @cachetools.cachedmethod(operator.attrgetter("_bi_id_cache"),
                             lock=lambda _: id_lock)
    def get_by_bi_id(cls, id):
        return InterfaceProfile.objects.filter(bi_id=id).first()

    @classmethod
    @cachetools.cachedmethod(operator.attrgetter("_name_cache"),
                             lock=lambda _: id_lock)
    def get_by_name(cls, name):
        return InterfaceProfile.objects.filter(name=name).first()

    @classmethod
    @cachetools.cachedmethod(operator.attrgetter("_default_cache"),
                             lock=lambda _: id_lock)
    def get_default_profile(cls):
        return InterfaceProfile.objects.filter(
            name=cls.DEFAULT_PROFILE_NAME).first()

    @classmethod
    @cachetools.cachedmethod(operator.attrgetter("_status_discovery_cache"),
                             lock=lambda _: id_lock)
    def get_with_status_discovery(cls):
        """
        Get list of interface profile ids with status_discovery = True
        :return:
        """
        return list(x["_id"] for x in InterfaceProfile._get_collection().find(
            {"status_discovery": True}, {"_id": 1}))
Esempio n. 19
0
class ErroneousModel(Document):
    meta = {'collection': 'test_colliding_objects_model'}

    objects = ListField(StringField())
Esempio n. 20
0
 class Animal(Document):
     name = StringField()
     meta = {'allow_inheritance': True, 'indexes': ['name']}
Esempio n. 21
0
class ManagementPolicy(EmbeddedDocument):
    protocol = StringField(choices=[("cli", "CLI"), ("snmp",
                                                     "SNMP"), ("http",
                                                               "HTTP")])
Esempio n. 22
0
 def __init__(self, *args, **kwargs):
     if 'default' not in kwargs:
         kwargs['default'] = '{}'
     StringField.__init__(self, *args, **kwargs)
Esempio n. 23
0
class Story(Document):
    uid = StringField(primary_key=True, max_length=91, min_length=26)
    time = LongField(required=True)
    blocks = ListField(EmbeddedDocumentField(Block), required=True)
    version = StringField(required=True)
Esempio n. 24
0
class Interface(Document):
    """
    Interfaces
    """

    meta = {
        "collection":
        "noc.interfaces",
        "strict":
        False,
        "auto_create_index":
        False,
        "indexes": [
            ("managed_object", "name"),
            "mac",
            ("managed_object", "ifindex"),
            "service",
            "aggregated_interface",
        ],
    }
    managed_object = ForeignKeyField(ManagedObject)
    name = StringField()  # Normalized via Profile.convert_interface_name
    type = StringField(choices=[(x, x) for x in INTERFACE_TYPES])
    description = StringField(required=False)
    ifindex = IntField(required=False)
    mac = StringField(required=False)
    aggregated_interface = PlainReferenceField("self", required=False)
    enabled_protocols = ListField(
        StringField(choices=[(x, x) for x in INTERFACE_PROTOCOLS]), default=[])
    profile = PlainReferenceField(InterfaceProfile,
                                  default=InterfaceProfile.get_default_profile)
    # profile locked on manual user change
    profile_locked = BooleanField(required=False, default=False)
    #
    project = ForeignKeyField(Project)
    state = ForeignKeyField(ResourceState)
    vc_domain = ForeignKeyField(VCDomain)
    # Current status
    admin_status = BooleanField(required=False)
    oper_status = BooleanField(required=False)
    oper_status_change = DateTimeField(required=False,
                                       default=datetime.datetime.now)
    full_duplex = BooleanField(required=False)
    in_speed = IntField(required=False)  # Input speed, kbit/s
    out_speed = IntField(required=False)  # Output speed, kbit/s
    bandwidth = IntField(required=False)  # Configured bandwidth, kbit/s
    # Coverage
    coverage = PlainReferenceField(Coverage)
    technologies = ListField(StringField())
    # External NRI interface name
    nri_name = StringField()
    #
    service = ReferenceField(Service)

    PROFILE_LINK = "profile"

    def __str__(self):
        return "%s: %s" % (self.managed_object.name, self.name)

    def iter_changed_datastream(self, changed_fields=None):
        if config.datastream.enable_managedobject:
            yield "managedobject", self.managed_object.id

    def save(self, *args, **kwargs):
        if not hasattr(self,
                       "_changed_fields") or "name" in self._changed_fields:
            self.name = self.managed_object.get_profile(
            ).convert_interface_name(self.name)
        if (not hasattr(self, "_changed_fields")
                or "mac" in self._changed_fields) and self.mac:
            self.mac = MACAddressParameter().clean(self.mac)
        try:
            super(Interface, self).save(*args, **kwargs)
        except Exception as e:
            raise ValueError("%s: %s" % (e.__doc__, e.message))
        if not hasattr(self,
                       "_changed_fields") or "service" in self._changed_fields:
            ServiceSummary.refresh_object(self.managed_object)

    def on_delete(self):
        from .macdb import MACDB

        # Remove all subinterfaces
        for si in self.subinterface_set.all():
            si.delete()
        # Unlink
        link = self.link
        if link:
            self.unlink()
        # Flush MACDB
        MACDB.objects.filter(interface=self.id).delete()

    @property
    def link(self):
        """
        Return Link instance or None
        :return:
        """
        if self.type == "aggregated":
            q = {
                "interfaces__in": [self.id] + [i.id for i in self.lag_members]
            }
        else:
            q = {"interfaces": self.id}
        return Link.objects.filter(**q).first()

    @property
    def is_linked(self):
        """
        Check interface is linked
        :returns: True if interface is linked, False otherwise
        """
        if self.type == "aggregated":
            q = {
                "interfaces": {
                    "$in": [self.id] + [i.id for i in self.lag_members]
                }
            }
        else:
            q = {"interfaces": self.id}
        return bool(Link._get_collection().with_options(
            read_preference=ReadPreference.SECONDARY_PREFERRED).find_one(q))

    def unlink(self):
        """
        Remove existing link.
        Raise ValueError if interface is not linked
        """
        link = self.link
        if link is None:
            raise ValueError("Interface is not linked")
        if link.is_ptp or link.is_lag:
            link.delete()
        else:
            raise ValueError("Cannot unlink non p-t-p link")

    def link_ptp(self, other, method=""):
        """
        Create p-t-p link with other interface
        Raise ValueError if either of interface already connected.
        :param other: Other Iface for link
        :param method: Linking method
        :type other: Interface
        :returns: Link instance
        """
        def link_mismatched_lag(agg, phy):
            """
            Try to link LAG to physical interface
            :param agg:
            :param phy:
            :return:
            """
            l_members = [i for i in agg.lag_members if i.oper_status]
            if len(l_members) > 1:
                raise ValueError("More then one active interface in LAG")
            link = Link(interfaces=l_members + [phy], discovery_method=method)
            link.save()
            return link

        # Try to check existing LAG
        el = Link.objects.filter(interfaces=self.id).first()
        if el and other not in el.interfaces:
            el = None
        if (self.is_linked or other.is_linked) and not el:
            raise ValueError("Already linked")
        if self.id == other.id:
            raise ValueError("Cannot link with self")
        if self.type in ("physical", "management"):
            if other.type in ("physical", "management"):
                # Refine LAG
                if el:
                    left_ifaces = [
                        i for i in el.interfaces if i not in (self, other)
                    ]
                    if left_ifaces:
                        el.interfaces = left_ifaces
                        el.save()
                    else:
                        el.delete()
                #
                link = Link(interfaces=[self, other], discovery_method=method)
                link.save()
                return link
            elif other.type == "aggregated" and other.profile.allow_lag_mismatch:
                return link_mismatched_lag(other, self)
            else:
                raise ValueError("Cannot connect %s interface to %s" %
                                 (self.type, other.type))
        elif self.type == "aggregated":
            # LAG
            if other.type == "aggregated":
                # Check LAG size match
                # Skip already linked members
                l_members = [i for i in self.lag_members if not i.is_linked]
                r_members = [i for i in other.lag_members if not i.is_linked]
                if len(l_members) != len(r_members):
                    raise ValueError("LAG size mismatch")
                # Create link
                if l_members:
                    link = Link(interfaces=l_members + r_members,
                                discovery_method=method)
                    link.save()
                    return link
                else:
                    return
            elif self.profile.allow_lag_mismatch:
                return link_mismatched_lag(self, other)
            else:
                raise ValueError("Cannot connect %s interface to %s" %
                                 (self.type, other.type))
        raise ValueError("Cannot link")

    @classmethod
    def get_interface(cls, s):
        """
        Parse <managed object>@<interface> string
        and return interface instance or None
        """
        if "@" not in s:
            raise ValueError("Invalid interface: %s" % s)
        o, i = s.rsplit("@", 1)
        # Get managed object
        try:
            mo = ManagedObject.objects.get(name=o)
        except ManagedObject.DoesNotExist:
            raise ValueError("Invalid manged object: %s" % o)
        # Normalize interface name
        i = mo.get_profile().convert_interface_name(i)
        # Look for interface
        iface = Interface.objects.filter(managed_object=mo.id, name=i).first()
        return iface

    @property
    def subinterface_set(self):
        from .subinterface import SubInterface

        return SubInterface.objects.filter(interface=self.id)

    @property
    def lag_members(self):
        if self.type != "aggregated":
            raise ValueError(
                "Cannot net LAG members for not-aggregated interface")
        return Interface.objects.filter(aggregated_interface=self.id)

    @property
    def effective_vc_domain(self):
        if self.type in ("null", "tunnel", "other", "unknown"):
            return None
        if self.vc_domain:
            return self.vc_domain
        if self.managed_object.vc_domain:
            return self.managed_object.vc_domain
        return VCDomain.get_default()

    @property
    def status(self):
        """
        Returns interface status in form of
        Up/100/Full
        """
        def humanize_speed(speed):
            if not speed:
                return "-"
            for t, n in [(1000000, "G"), (1000, "M"), (1, "k")]:
                if speed >= t:
                    if speed // t * t == speed:
                        return "%d%s" % (speed // t, n)
                    else:
                        return "%.2f%s" % (float(speed) / t, n)
            return str(speed)

        s = [{True: "Up", False: "Down", None: "-"}[self.oper_status]]
        # Speed
        if self.oper_status:
            if self.in_speed and self.in_speed == self.out_speed:
                s += [humanize_speed(self.in_speed)]
            else:
                s += [
                    humanize_speed(self.in_speed),
                    humanize_speed(self.out_speed)
                ]
            s += [{True: "Full", False: "Half", None: "-"}[self.full_duplex]]
        else:
            s += ["-", "-"]
        return "/".join(s)

    def set_oper_status(self, status):
        """
        Set current oper status
        """
        if self.oper_status == status:
            return
        now = datetime.datetime.now()
        if self.oper_status != status and (not self.oper_status_change
                                           or self.oper_status_change < now):
            self.update(oper_status=status, oper_status_change=now)
            if self.profile.status_change_notification:
                logger.debug(
                    "Sending status change notification to %s",
                    self.profile.status_change_notification.name,
                )
                self.profile.status_change_notification.notify(
                    subject="[%s] Interface %s(%s) is %s" % (
                        self.managed_object.name,
                        self.name,
                        self.description or "",
                        "up" if status else "down",
                    ),
                    body="Interface %s (%s) is %s" %
                    (self.name, self.description
                     or "", "up" if status else "down"),
                )

    @property
    def parent(self):
        """
        Returns aggregated interface for LAG or
        self for non-aggregated interface
        """
        if self.aggregated_interface:
            return self.aggregated_interface
        else:
            return self

    def get_profile(self):
        if self.profile:
            return self.profile
        return InterfaceProfile.get_default_profile()
Esempio n. 25
0
class Convention(BDocument):
    label = StringField()
    tariff = EmbeddedDocumentField(Tariff)
    min = FloatField()
    max = FloatField()
    exceptions = EmbeddedDocumentListField(ConventionException)
Esempio n. 26
0
class HostModel(DynamicDocument):
    username = StringField()
    levels = DictField()
    blockchain = StringField()
    registered_at = DateTimeField()
    architect = StringField()
    hoperator = StringField()
    consensus_percent = FloatField()
    referral_percent = FloatField()
    dac_mode = IntField()
    dacs = DictField()
    chosts = DictField()
    ahost = StringField()
    non_active_chost = BooleanField()
    need_switch = BooleanField()
    fhosts_mode = IntField()
    fhosts = DictField()
    title = StringField()
    purpose = StringField()
    total_shares = IntField()
    quote_amount = StringField()
    root_token_contract = StringField()
    root_token = StringField()
    symbol = StringField()
    precision = IntField()
    to_pay = IntField()
    payed = BooleanField()
    cycle_start_id = IntField()
    current_pool_id = IntField()
    current_cycle_num = IntField()
    current_pool_num = IntField()
    parameters_setted = BooleanField()
    activated = BooleanField()
    priority_flag = BooleanField()
    meta = StringField()
    app = StringField()

    meta = {
        'collection':
        'hosts',
        'ordering': ['-registered_at'],
        'indexes': [
            'username', 'blockchain', 'ahost', 'activated', 'payed',
            'parameters_setted'
            'priority_flag'
            'need_switch', 'non_active_chost', 'app'
        ],
        'auto_create_index':
        True,
        'index_background':
        True
    }
Esempio n. 27
0
class AWSImage(Document):
    meta = {'collection': 'awsImage'}
    extra = DictField()
    name = StringField()
Esempio n. 28
0
class SchemaElement(Document):
    tag = StringField(required=True)
    value = StringField(default=None)
    options = DictField()
    children = ListField(ReferenceField('SchemaElement'))
Esempio n. 29
0
class Hashtags_trend(Document):
    meta = {'collection': 'US_HASHTAGS_TREND_copy'}
    full_name = StringField(required=True)
    tweet_text= StringField(required=True)
    no_of_replies = StringField(required=True)
    number_of_likes = StringField(required=True)
    hashtags= StringField(required=True)
    username = StringField(required=True)
    no_of_retweets = StringField(required=True)
    twitter_url= StringField(required=True)
    call_to_action = StringField(required=True)
    no_of_hashtags = StringField(required=True)
    mentions= StringField(required=True)
    tweet_time = StringField(required=True)
    no_of_mentions = StringField(required=True)
    sentiment = StringField(required=True)
    Country=StringField(required=True)    
Esempio n. 30
0
class Child(Parent):

    meta = {'collection': 'test_child'}
    baz = StringField()
    loc = PointField()
Esempio n. 31
0
 def __init__(self, *args, **kwargs):
     if 'default' not in kwargs:
         kwargs['default'] = '{}'
     StringField.__init__(self, *args, **kwargs)
Esempio n. 32
0
class Tag(Document, DocumentHelperMixin):

    # BIG DB migration 20141028
    bigmig_migrated = BooleanField(default=False)
    # END BIG DB migration

    name = StringField(verbose_name=_(u'name'), unique=True)
    slug = StringField(verbose_name=_(u'slug'))
    language = StringField(verbose_name=_(u'language'), default='')
    parents = ListField(ReferenceField('self', reverse_delete_rule=PULL),
                        default=list)
    children = ListField(ReferenceField('self', reverse_delete_rule=PULL),
                         default=list)
    # reverse_delete_rule=NULLIFY,
    origin = GenericReferenceField(verbose_name=_(u'Origin'),
                                   help_text=_(u'Initial origin from where '
                                               u'the tag was created from, '
                                               u'to eventually help '
                                               u'defining other attributes.'))
    duplicate_of = ReferenceField('Tag',
                                  reverse_delete_rule=NULLIFY,
                                  verbose_name=_(u'Duplicate of'),
                                  help_text=_(u'Put a "master" tag here to '
                                              u'help avoiding too much '
                                              u'different tags (eg. singular '
                                              u'and plurals) with the same '
                                              u'meaning and loss of '
                                              u'information.'))

    meta = {
        'indexes': [
            'name',
        ]
    }

    # See the `WordRelation` class before working on this.
    #
    # antonyms = ListField(ReferenceField('self'), verbose_name=_(u'Antonyms'),
    #                      help_text=_(u'Define an antonym tag to '
    #                      u'help search connectable but.'))

    def __unicode__(self):
        return _(u'{0} {1}⚐ (#{2})').format(self.name, self.language, self.id)

    def replace_duplicate_everywhere(self, duplicate_id, *args, **kwargs):

        duplicate = self.__class__.objects.get(id=duplicate_id)

        # This method is defined in nonrel.article to avoid an import loop.
        self.replace_duplicate_in_articles(duplicate, *args, **kwargs)
        #
        # TODO: do the same for feeds, reads (, subscriptions?) …
        #
        pass

    @classmethod
    def signal_post_save_handler(cls,
                                 sender,
                                 document,
                                 created=False,
                                 **kwargs):

        tag = document

        if created:
            if tag._db_name != settings.MONGODB_NAME_ARCHIVE:

                # HEADS UP: this task is declared by
                # the register_task_method call below.
                tag_post_create_task.delay(tag.id)  # NOQA

    def post_create_task(self):
        """ Method meant to be run from a celery task. """

        if not self.slug:
            self.slug = slugify(self.name)
            self.save()

            statsd.gauge('mongo.tags.counts.total', 1, delta=True)

    @classmethod
    def get_tags_set(cls, tags_names, origin=None):

        tags = set()

        for tag_name in tags_names:
            tag_name = tag_name.lower()

            try:
                tag = cls.objects.get(name=tag_name)

            except cls.DoesNotExist:
                try:
                    tag = cls(name=tag_name, origin=origin).save()

                except (NotUniqueError, DuplicateKeyError):
                    tag = cls.objects.get(name=tag_name)

            tags.add(tag.duplicate_of or tag)

        return tags

    def save(self, *args, **kwargs):
        """ This method will simply add the missing children/parents reverse
            links of the current Tag. This is needed when modifying tags from
            the Django admin, which doesn't know about the reverse-link
            existence.

            .. note:: sadly, we have no fast way to do the same for links
                removal.
        """

        super(Tag, self).save(*args, **kwargs)

        for parent in self.parents:
            if self in parent.children:
                continue

            try:
                parent.add_child(self,
                                 update_reverse_link=False,
                                 full_reload=False)
            except:
                LOGGER.exception(
                    u'Exception while reverse-adding '
                    u'child %s to parent %s', self, parent)

        for child in self.children:
            if self in child.parents:
                continue

            try:
                child.add_parent(self,
                                 update_reverse_link=False,
                                 full_reload=False)
            except:
                LOGGER.exception(
                    u'Exception while reverse-adding '
                    u'parent %s to child %s', self, child)

        return self

    def add_parent(self, parent, update_reverse_link=True, full_reload=True):

        self.update(add_to_set__parents=parent)

        if full_reload:
            self.safe_reload()

        if update_reverse_link:
            parent.add_child(self, update_reverse_link=False)

    def remove_parent(self,
                      parent,
                      update_reverse_link=True,
                      full_reload=True):

        if update_reverse_link:
            parent.remove_child(self, update_reverse_link=False)

        self.update(pull__parents=parent)

        if full_reload:
            self.safe_reload()

    def add_child(self, child, update_reverse_link=True, full_reload=True):
        self.update(add_to_set__children=child)

        if full_reload:
            self.safe_reload()

        if update_reverse_link:
            child.add_parent(self, update_reverse_link=False)

    def remove_child(self, child, update_reverse_link=True, full_reload=True):

        if update_reverse_link:
            child.remove_parent(self, update_reverse_link=False)

        self.update(pull__children=child)

        if full_reload:
            self.safe_reload()