Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- from __future__ import unicode_literals
- import os
- import datetime as dt
- import subprocess
- import xml.etree.cElementTree as ET
- from django.core.exceptions import ObjectDoesNotExist
- from django.conf import settings
- from rest_framework.views import APIView
- from rest_framework import generics
- from rest_framework import pagination
- from rest_framework.response import Response
- from rest_framework import status
- from . import idtech_models
- from . import serializers as s
- id_offset = 1
- class ReaderGetApiView(APIView):
- def get(self, request, format=None):
- """
- Readers list view
- ---
- omit_serializer: true
- many: true
- type:
- - name: id
- type: integer
- - name: name
- type: string
- """
- data = []
- qs = idtech_models.Lect.objects.using('idtech').all()
- for obj in qs:
- data.append({
- 'id': obj.n_lect,
- 'name': (obj.libel0 or obj.libel1 or obj.libel2).strip()
- })
- return Response(data, status=status.HTTP_200_OK)
- class HistoryAPIView(generics.ListAPIView):
- now = dt.datetime.now()
- delta = now - dt.timedelta(days=30)
- month_ago = unicode(dt.date(delta.year, delta.month, delta.day))
- queryset = idtech_models.Hist.objects.all().filter(d_hist__gte=month_ago)
- serializer_class = s.HistSerializer
- pagination_class = pagination.PageNumberPagination
- class MaskApiView(APIView):
- def get(self, request):
- subprocess.Popen('C:\oc.bat', shell=False)
- return Response(status=status.HTTP_200_OK)
- class AccessRulesApiView(APIView):
- def post(self, request):
- """
- Rule resource.
- ---
- example:
- [
- {
- 'name': 'heti szabály',
- 'readers': [1, 2, 3],
- 'id': 1,
- 'days': [[12:00, 20:00],
- [08:00, 20:00],
- [00:00, 00:00],
- [00:00, 00:00],
- [00:00, 00:00],
- [00:00, 00:00],
- [00:00, 00:00]]
- }
- ]
- """
- request_data = request.data
- access_rule_id_list = [data['id'] for data in request_data]
- self.delete_old_hour_rules(access_rule_id_list)
- for data in request_data:
- readers = self.get_readers(data['readers'])
- weekly_rule = self.check_weekly_rule_is_exists(data)
- if weekly_rule is False:
- daily_rules = self.get_daily_rules(data, readers)
- self.make_weekly_rule(data, daily_rules, readers)
- else:
- self.update_weekly_rule(weekly_rule, data, readers)
- return Response(status=status.HTTP_200_OK)
- def get_readers(self, readers_id):
- return idtech_models.Lect.objects.filter(n_lect__in=readers_id)
- def delete_old_hour_rules(self, access_rule_id_list):
- idtech_models.Reg.objects.all().delete()
- idtech_models.Regl.objects.all().delete()
- idtech_models.HorA.objects.exclude(n_hor_a=1).delete()
- idtech_models.CycReg.objects.exclude(n_cyc_reg__in=access_rule_id_list).delete()
- def update_weekly_rule(self, weekly_rule, data, readers):
- """ Heti szabályok frissítése
- Minden napi és órás szabályt törlünk az adatbázisból és újraírjuk őket,
- még akkor is, ha nem változott semmi, majd újra bekapcsoljuk a heti szabályba
- """
- daily_rules = self.get_daily_rules(data, readers)
- rules_for_the_week = self.get_daily_rule_for_each_day(data, daily_rules, readers)
- for attr, value in rules_for_the_week.iteritems():
- setattr(weekly_rule, attr, value)
- weekly_rule.save()
- def check_weekly_rule_is_exists(self, data):
- try:
- weekly_rule = idtech_models.CycReg.objects.get(n_cyc_reg=data['id'])
- return weekly_rule
- except idtech_models.CycReg.DoesNotExist:
- return False
- def get_hour_rule(self, data):
- """ Órás szabályok létrehozása"""
- last_id = id_offset - 1
- if idtech_models.HorA.objects.filter(n_hor_a__gte=id_offset).exists():
- last_id = idtech_models.HorA.objects.filter(
- n_hor_a__gte=id_offset).order_by('n_hor_a').last().n_hor_a
- day_list = data['days']
- hour_rules = []
- for day in [list(item) for item in set(tuple(row) for row in day_list)]:
- hor, _ = idtech_models.HorA.objects.get_or_create(n_hor_a=last_id + 1, defaults={
- 'libel0': data['name'],
- 'libel1': data['name'],
- 'libel2': data['name'],
- 'h_deb01': day[0],
- 'h_fin01': day[1],
- 'action01': '1'
- })
- hour_rules.append(hor)
- last_id = last_id + 1
- return hour_rules
- def get_daily_rules(self, data, readers):
- """ Napi szabályok létrehozása.
- A Regl kapcsolótábla, a napiszabályokat(Reg)
- köti össze az olvasókkal(Lect) és az órás szabályokal(Hor_A)"""
- last_id = id_offset - 1
- if idtech_models.Reg.objects.filter(n_reg__gte=id_offset).exists():
- last_id = idtech_models.Reg.objects.filter(n_reg__gte=id_offset).order_by(
- 'n_reg').last().n_reg
- hour_rules = self.get_hour_rule(data)
- daily_rules = []
- for hour_rule in hour_rules:
- daily_rule, _ = idtech_models.Reg.objects.get_or_create(n_reg=last_id + 1,
- defaults={
- 'libel0': data['name'],
- 'libel1': data['name'],
- 'libel2': data['name'],
- 'with_readers': 'Y',
- 'with_zones': 'N',
- 'with_reader_groups': 'N'
- })
- daily_rules.append(daily_rule)
- for reader in readers:
- idtech_models.Regl.objects.create(
- n_reg=daily_rule.n_reg,
- n_hor=hour_rule.n_hor_a,
- n_lect=reader.n_lect
- )
- last_id = last_id + 1
- return daily_rules
- def make_weekly_rule(self, data, daily_rules, readers):
- """Heti szabály(CycReg) létrehozása"""
- weekly_rule, created = idtech_models.CycReg.objects.get_or_create(
- n_cyc_reg=data['id'], defaults={'libel0': data['name'],
- 'libel1': data['name'],
- 'libel2': data['name']},
- **self.get_daily_rule_for_each_day(data, daily_rules, readers)
- )
- return weekly_rule
- def get_daily_rule_for_each_day(self, data, list_of_daily_rule, readers):
- """ Újra ki kell keresni a napi szabályokat,
- hogy melyiket melyik napra kapcsoljuk be a heti szabályba"""
- results = {}
- daily_rules = idtech_models.Reg.objects.filter(n_reg__in=[dr.n_reg for dr in list_of_daily_rule]) # noqa
- regl_objects = idtech_models.Regl.objects.filter(n_reg__in=daily_rules,
- n_lect=readers[0].n_lect)
- hour_rules = idtech_models.HorA.objects.filter(n_hor_a__in=[i.n_hor for i in regl_objects])
- for day_index in range(0, 7):
- for hour_rule in hour_rules:
- start = data['days'][day_index][0]
- end = data['days'][day_index][1]
- if start == hour_rule.h_deb01 and end == hour_rule.h_fin01:
- regl = regl_objects.get(n_hor=hour_rule.n_hor_a)
- daily_rule = daily_rules.get(n_reg=regl.n_reg)
- results['n_reg%s' % str(day_index).zfill(2)] = daily_rule.n_reg
- return results
- class XmlImportApiView(APIView):
- # def get_cards(self, user):
- # person = idtech_models.PersSign.objects.get(oid=user['id'])
- # person_cards = {}
- # for i in range(1, 6):
- # card = getattr(person, 'badge_{}'.format(i))
- # if card:
- # person_cards['badge_{}'.format(i)] = card
- def post(self, request):
- start = dt.datetime.now()
- end = start + dt.timedelta(days=36500)
- file_name = start.strftime("%Y_%m_%d_%H_%M_%S_%f")
- main = ET.Element('Import')
- root = ET.ElementTree(main)
- data = request.data
- company_id = unicode(data['company_id'])
- site_id = unicode(data['site_id'])
- employees = data['employees'] + data['vehicles']
- for employee in employees:
- now = dt.datetime.now()
- yolo = now.strftime("%Y_%m_%d_%H_%M_%S_%f")
- pers = ET.SubElement(main, 'Pers', id=unicode(employee['id']), operation='merge')
- user_is_enabled = True if employee['access_rule'] else False
- company = ET.SubElement(pers, 'Company', id=company_id, operation='merge')
- site = ET.SubElement(company, 'Site', id=site_id, operation='merge')
- ET.SubElement(site, 'Status').text = 'Enabled' if user_is_enabled else 'Disabled'
- for r1 in range(1, 6):
- ET.SubElement(pers, 'Card', id=unicode(r1), operation='delete')
- for r2 in range(1, 6):
- ET.SubElement(site, 'Access-Rule', id=unicode(r2), operation='delete')
- xml_file = open(settings.XML_DIR + '{}.xfer'.format(yolo), 'w')
- root.write(xml_file, encoding='ISO-8859-2', xml_declaration=True)
- xml_file.close()
- os.rename(settings.XML_DIR + '{}.xfer'.format(yolo),
- settings.XML_DIR + '{}.new'.format(yolo))
- for user in employees:
- name = user['full_name'].split(' ')
- last_name = name[0] if len(name) > 0 else ''
- first_name = name[1] if len(name) > 1 else ''
- if len(name) > 2:
- first_name += ' ' + name[2]
- user_is_enabled = True if user['access_rule'] else False
- pers = ET.SubElement(main, 'Pers', id=unicode(user['id']), operation='merge')
- ET.SubElement(pers, 'Last-Name').text = last_name
- ET.SubElement(pers, 'First-Name').text = first_name
- ET.SubElement(pers, 'Access-Type').text = 'Pers'
- ET.SubElement(pers, 'Status').text = 'Enabled' if user_is_enabled else 'Disabled'
- if user['proxi']:
- proxies = user['proxi'].split(', ')
- for n, proxi in enumerate([p for p in proxies if len(p) < 11]):
- if n + 1 < 6:
- cards = ET.SubElement(pers, 'Card', id=unicode(n + 1), operation='insert')
- ET.SubElement(cards, 'Number').text = unicode(proxi)
- company = ET.SubElement(pers, 'Company', id=company_id, operation='merge')
- ET.SubElement(company, 'Status').text = 'Enabled' if user_is_enabled else 'Disabled'
- site = ET.SubElement(company, 'Site', id=site_id, operation='merge')
- ET.SubElement(site, 'Status').text = 'Enabled' if user_is_enabled else 'Disabled'
- # for r2 in range(1, 6):
- # ET.SubElement(site, 'Access-Rule', id=unicode(r2), operation='delete')
- if user_is_enabled:
- for count, elem in enumerate(user['access_rule']):
- rule = ET.SubElement(site, 'Access-Rule', id=unicode(count + 1),
- operation='insert')
- ET.SubElement(rule, 'Rule').text = unicode(elem)
- ET.SubElement(rule, 'Start-Date').text = unicode(start.strftime('%Y/%m/%d'))
- ET.SubElement(rule, 'End-Date').text = unicode(end.strftime('%Y/%m/%d'))
- ET.SubElement(rule, 'Start-Time').text = unicode(start.strftime('%H:%M'))
- ET.SubElement(rule, 'End-Time').text = unicode(end.strftime('%H:%M'))
- xml_file = open(settings.XML_DIR + '{}.xfer'.format(file_name), 'w')
- root.write(xml_file, encoding='ISO-8859-2', xml_declaration=True)
- xml_file.close()
- os.rename(settings.XML_DIR + '{}.xfer'.format(file_name),
- settings.XML_DIR + '{}.new'.format(file_name))
- return Response(status=status.HTTP_200_OK)
- class VisitorXmlImportApiView(APIView):
- def post(self, request):
- data = request.data
- visitor = data['visitor']
- now = dt.datetime.now()
- file_name = now.strftime("%Y_%m_%d_%H_%M_%S_%f")
- main = ET.Element('Import')
- root = ET.ElementTree(main)
- company_id = unicode(data['company_id'])
- site_id = unicode(data['site_id'])
- name = visitor['full_name'].split(' ')
- last_name = name[0] if len(name) > 0 else ''
- first_name = name[1] if len(name) > 1 else ''
- if len(name) > 2:
- first_name += ' ' + name[2]
- user_is_enabled = True if visitor['access_rule'] else False
- pers = ET.SubElement(main, 'Pers', id=unicode(visitor['id']), operation='merge')
- ET.SubElement(pers, 'Last-Name').text = last_name
- ET.SubElement(pers, 'First-Name').text = first_name
- ET.SubElement(pers, 'Access-Type').text = 'Pers'
- ET.SubElement(pers, 'Status').text = 'Enabled' if user_is_enabled else 'Disabled'
- for r1 in range(1, 6):
- ET.SubElement(pers, 'Card', id=unicode(r1), operation='delete')
- if visitor['proxi']:
- proxies = visitor['proxi'].split(', ')
- for n, proxi in enumerate([p for p in proxies if len(p) < 11]):
- if n + 1 < 6:
- cards = ET.SubElement(pers, 'Card', id=unicode(n + 1), operation='insert')
- ET.SubElement(cards, 'Number').text = unicode(proxi)
- company = ET.SubElement(pers, 'Company', id=company_id, operation='merge')
- ET.SubElement(company, 'Status').text = 'Enabled' if user_is_enabled else 'Disabled'
- site = ET.SubElement(company, 'Site', id=site_id, operation='merge')
- ET.SubElement(site, 'Status').text = 'Enabled' if user_is_enabled else 'Disabled'
- for r2 in range(1, 6):
- ET.SubElement(site, 'Access-Rule', id=unicode(r2), operation='delete')
- if user_is_enabled:
- for count, elem in enumerate(visitor['access_rule']):
- rule = ET.SubElement(site, 'Access-Rule', id=unicode(count + 1),
- operation='insert')
- ET.SubElement(rule, 'Rule').text = unicode(elem)
- ET.SubElement(rule, 'Start-Date').text = unicode(visitor['start_date'])
- ET.SubElement(rule, 'End-Date').text = unicode(visitor['end_date'])
- ET.SubElement(rule, 'Start-Time').text = unicode(visitor['start_time'])
- ET.SubElement(rule, 'End-Time').text = unicode(visitor['end_time'])
- xml_file = open(settings.XML_DIR + '{}.xfer'.format(file_name), 'w')
- root.write(xml_file, encoding='ISO-8859-2', xml_declaration=True)
- xml_file.close()
- os.rename(settings.XML_DIR + '{}.xfer'.format(file_name),
- settings.XML_DIR + '{}.new'.format(file_name))
- return Response(status=status.HTTP_200_OK)
- class EmployeeDeleteXmlImportApiView(APIView):
- def post(self, request):
- data = request.data
- employee = data['employee']
- if not self.employee_is_exist(employee['id']):
- return Response(status=status.HTTP_204_NO_CONTENT)
- now = dt.datetime.now()
- file_name = now.strftime("%Y_%m_%d_%H_%M_%S_%f")
- main = ET.Element('Import')
- root = ET.ElementTree(main)
- pers = ET.SubElement(main, 'Pers', id=unicode(employee['id']), operation='delete')
- for r1 in range(1, 6):
- ET.SubElement(pers, 'Card', id=unicode(r1), operation='delete')
- xml_file = open(settings.XML_DIR + '{}.xfer'.format(file_name), 'w')
- root.write(xml_file, encoding='ISO-8859-2', xml_declaration=True)
- xml_file.close()
- os.rename(settings.XML_DIR + '{}.xfer'.format(file_name),
- settings.XML_DIR + '{}.new'.format(file_name))
- return Response(status=status.HTTP_200_OK)
- def employee_is_exist(self, employee_id):
- try:
- return idtech_models.PersSign.objects.get(pk=employee_id)
- except ObjectDoesNotExist:
- return None
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement