# -*- coding: utf-8 -*- from __future__ import unicode_literals import urllib import re from django.db import models from django.utils.encoding import force_text from django.contrib.contenttypes.models import ContentType from idcops.models import Client, Syslog, User from idcops.lib.utils import display_for_field def get_related_client_name(obj): related_clients = [] for f in obj._meta.fields: if f.related_model is Client or ( f.name == 'client' and isinstance(f, models.CharField)): value = display_for_field(f.value_from_object(obj), f, html=False) related_clients.append(value) return '{}'.format(", ".join(c for c in list(set(related_clients)))) def log_action( user_id, content_type_id, object_id, action_flag, message='', content='', actived=True, related_client=None): model = ContentType.objects.get_for_id(content_type_id).model_class() object = model.objects.get(pk=object_id) if related_client is None: related_client = get_related_client_name(object) or '-' user = User.objects.get(pk=user_id) onidc_id = user.onidc_id log = Syslog.objects.create( creator_id=user_id, onidc_id=onidc_id, object_repr=object, action_flag=action_flag, message=message, object_desc=force_text(object)[:128], related_client=related_client[:128], content=content, actived=actived ) return force_text(log) def get_dell_model(sn, model): """ 返回Dell设备SN号对应的设备型号 """ query_url = "http://www.dell.com/support/home/cn/zh/cnbsdt1/product-support/servicetag/" pattern = "deel|dell|PowerEdge|R7|R8|R6|R4|戴尔" if re.findall(pattern, model, re.M | re.I | re.U): try: url = "{0}{1}".format(query_url, sn) response = urllib.request(url, timeout=30) html = response.read() _model = ''.join(re.findall(r'productName:"(.*?)"', html)) _code = ''.join(re.findall( r'<span class="beforeCaptcha">(.*?)</span>', html)) except: _model = model _code = None else: _model = model _code = None return _model, _code def device_post_save(pk, first=False): """ 设备信息保存后需要自动更新该设备的相关信息. """ from idcops.models import Device # 获取设备信息 try: obj = Device.objects.get(pk=pk) except: return # 更新设备状态 if not obj.actived: status = 'offline' else: if obj.move_history and obj.actived: status = 'moved' else: status = 'online' Device.objects.filter(pk=obj.pk).update(status=status) ''' if obj.sn and obj.mark != 'CheckSuccess': # Dell 设备 if len(obj.sn.strip()) == 7: old_model = obj.model new_model, code = get_dell_model(obj.sn, obj.model) if code: mark = 'CheckSuccess' else: mark = 'CheckFailure' ''' return obj.status