Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.95 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3.  
  4. import os
  5. import datetime as dt
  6. import subprocess
  7. import xml.etree.cElementTree as ET
  8. from django.core.exceptions import ObjectDoesNotExist
  9. from django.conf import settings
  10. from rest_framework.views import APIView
  11. from rest_framework import generics
  12. from rest_framework import pagination
  13. from rest_framework.response import Response
  14. from rest_framework import status
  15.  
  16. from . import idtech_models
  17. from . import serializers as s
  18.  
  19.  
  20. id_offset = 1
  21.  
  22.  
  23. class ReaderGetApiView(APIView):
  24. def get(self, request, format=None):
  25. """
  26. Readers list view
  27. ---
  28.  
  29. omit_serializer: true
  30.  
  31. many: true
  32.  
  33. type:
  34. - name: id
  35. type: integer
  36. - name: name
  37. type: string
  38. """
  39. data = []
  40. qs = idtech_models.Lect.objects.using('idtech').all()
  41. for obj in qs:
  42. data.append({
  43. 'id': obj.n_lect,
  44. 'name': (obj.libel0 or obj.libel1 or obj.libel2).strip()
  45. })
  46. return Response(data, status=status.HTTP_200_OK)
  47.  
  48.  
  49. class HistoryAPIView(generics.ListAPIView):
  50. now = dt.datetime.now()
  51. delta = now - dt.timedelta(days=30)
  52. month_ago = unicode(dt.date(delta.year, delta.month, delta.day))
  53. queryset = idtech_models.Hist.objects.all().filter(d_hist__gte=month_ago)
  54. serializer_class = s.HistSerializer
  55. pagination_class = pagination.PageNumberPagination
  56.  
  57.  
  58. class MaskApiView(APIView):
  59. def get(self, request):
  60. subprocess.Popen('C:\oc.bat', shell=False)
  61. return Response(status=status.HTTP_200_OK)
  62.  
  63.  
  64. class AccessRulesApiView(APIView):
  65. def post(self, request):
  66. """
  67. Rule resource.
  68. ---
  69. example:
  70. [
  71. {
  72. 'name': 'heti szabály',
  73. 'readers': [1, 2, 3],
  74. 'id': 1,
  75. 'days': [[12:00, 20:00],
  76. [08:00, 20:00],
  77. [00:00, 00:00],
  78. [00:00, 00:00],
  79. [00:00, 00:00],
  80. [00:00, 00:00],
  81. [00:00, 00:00]]
  82. }
  83. ]
  84. """
  85.  
  86. request_data = request.data
  87. access_rule_id_list = [data['id'] for data in request_data]
  88. self.delete_old_hour_rules(access_rule_id_list)
  89.  
  90. for data in request_data:
  91. readers = self.get_readers(data['readers'])
  92. weekly_rule = self.check_weekly_rule_is_exists(data)
  93. if weekly_rule is False:
  94. daily_rules = self.get_daily_rules(data, readers)
  95. self.make_weekly_rule(data, daily_rules, readers)
  96. else:
  97. self.update_weekly_rule(weekly_rule, data, readers)
  98.  
  99. return Response(status=status.HTTP_200_OK)
  100.  
  101. def get_readers(self, readers_id):
  102. return idtech_models.Lect.objects.filter(n_lect__in=readers_id)
  103.  
  104. def delete_old_hour_rules(self, access_rule_id_list):
  105. idtech_models.Reg.objects.all().delete()
  106. idtech_models.Regl.objects.all().delete()
  107. idtech_models.HorA.objects.exclude(n_hor_a=1).delete()
  108. idtech_models.CycReg.objects.exclude(n_cyc_reg__in=access_rule_id_list).delete()
  109.  
  110. def update_weekly_rule(self, weekly_rule, data, readers):
  111. """ Heti szabályok frissítése
  112. Minden napi és órás szabályt törlünk az adatbázisból és újraírjuk őket,
  113. még akkor is, ha nem változott semmi, majd újra bekapcsoljuk a heti szabályba
  114. """
  115. daily_rules = self.get_daily_rules(data, readers)
  116.  
  117. rules_for_the_week = self.get_daily_rule_for_each_day(data, daily_rules, readers)
  118. for attr, value in rules_for_the_week.iteritems():
  119. setattr(weekly_rule, attr, value)
  120.  
  121. weekly_rule.save()
  122.  
  123. def check_weekly_rule_is_exists(self, data):
  124. try:
  125. weekly_rule = idtech_models.CycReg.objects.get(n_cyc_reg=data['id'])
  126. return weekly_rule
  127. except idtech_models.CycReg.DoesNotExist:
  128. return False
  129.  
  130. def get_hour_rule(self, data):
  131. """ Órás szabályok létrehozása"""
  132. last_id = id_offset - 1
  133. if idtech_models.HorA.objects.filter(n_hor_a__gte=id_offset).exists():
  134. last_id = idtech_models.HorA.objects.filter(
  135. n_hor_a__gte=id_offset).order_by('n_hor_a').last().n_hor_a
  136.  
  137. day_list = data['days']
  138. hour_rules = []
  139.  
  140. for day in [list(item) for item in set(tuple(row) for row in day_list)]:
  141. hor, _ = idtech_models.HorA.objects.get_or_create(n_hor_a=last_id + 1, defaults={
  142. 'libel0': data['name'],
  143. 'libel1': data['name'],
  144. 'libel2': data['name'],
  145. 'h_deb01': day[0],
  146. 'h_fin01': day[1],
  147. 'action01': '1'
  148. })
  149. hour_rules.append(hor)
  150. last_id = last_id + 1
  151.  
  152. return hour_rules
  153.  
  154. def get_daily_rules(self, data, readers):
  155. """ Napi szabályok létrehozása.
  156. A Regl kapcsolótábla, a napiszabályokat(Reg)
  157. köti össze az olvasókkal(Lect) és az órás szabályokal(Hor_A)"""
  158. last_id = id_offset - 1
  159. if idtech_models.Reg.objects.filter(n_reg__gte=id_offset).exists():
  160. last_id = idtech_models.Reg.objects.filter(n_reg__gte=id_offset).order_by(
  161. 'n_reg').last().n_reg
  162. hour_rules = self.get_hour_rule(data)
  163. daily_rules = []
  164.  
  165. for hour_rule in hour_rules:
  166. daily_rule, _ = idtech_models.Reg.objects.get_or_create(n_reg=last_id + 1,
  167. defaults={
  168. 'libel0': data['name'],
  169. 'libel1': data['name'],
  170. 'libel2': data['name'],
  171. 'with_readers': 'Y',
  172. 'with_zones': 'N',
  173. 'with_reader_groups': 'N'
  174. })
  175. daily_rules.append(daily_rule)
  176. for reader in readers:
  177. idtech_models.Regl.objects.create(
  178. n_reg=daily_rule.n_reg,
  179. n_hor=hour_rule.n_hor_a,
  180. n_lect=reader.n_lect
  181. )
  182. last_id = last_id + 1
  183.  
  184. return daily_rules
  185.  
  186. def make_weekly_rule(self, data, daily_rules, readers):
  187. """Heti szabály(CycReg) létrehozása"""
  188. weekly_rule, created = idtech_models.CycReg.objects.get_or_create(
  189. n_cyc_reg=data['id'], defaults={'libel0': data['name'],
  190. 'libel1': data['name'],
  191. 'libel2': data['name']},
  192. **self.get_daily_rule_for_each_day(data, daily_rules, readers)
  193. )
  194. return weekly_rule
  195.  
  196. def get_daily_rule_for_each_day(self, data, list_of_daily_rule, readers):
  197. """ Újra ki kell keresni a napi szabályokat,
  198. hogy melyiket melyik napra kapcsoljuk be a heti szabályba"""
  199. results = {}
  200. daily_rules = idtech_models.Reg.objects.filter(n_reg__in=[dr.n_reg for dr in list_of_daily_rule]) # noqa
  201. regl_objects = idtech_models.Regl.objects.filter(n_reg__in=daily_rules,
  202. n_lect=readers[0].n_lect)
  203. hour_rules = idtech_models.HorA.objects.filter(n_hor_a__in=[i.n_hor for i in regl_objects])
  204.  
  205. for day_index in range(0, 7):
  206. for hour_rule in hour_rules:
  207. start = data['days'][day_index][0]
  208. end = data['days'][day_index][1]
  209. if start == hour_rule.h_deb01 and end == hour_rule.h_fin01:
  210. regl = regl_objects.get(n_hor=hour_rule.n_hor_a)
  211. daily_rule = daily_rules.get(n_reg=regl.n_reg)
  212. results['n_reg%s' % str(day_index).zfill(2)] = daily_rule.n_reg
  213.  
  214. return results
  215.  
  216.  
  217. class XmlImportApiView(APIView):
  218. # def get_cards(self, user):
  219. # person = idtech_models.PersSign.objects.get(oid=user['id'])
  220. # person_cards = {}
  221. # for i in range(1, 6):
  222. # card = getattr(person, 'badge_{}'.format(i))
  223. # if card:
  224. # person_cards['badge_{}'.format(i)] = card
  225.  
  226. def post(self, request):
  227. start = dt.datetime.now()
  228. end = start + dt.timedelta(days=36500)
  229. file_name = start.strftime("%Y_%m_%d_%H_%M_%S_%f")
  230.  
  231. main = ET.Element('Import')
  232. root = ET.ElementTree(main)
  233.  
  234. data = request.data
  235. company_id = unicode(data['company_id'])
  236. site_id = unicode(data['site_id'])
  237.  
  238. employees = data['employees'] + data['vehicles']
  239.  
  240. for employee in employees:
  241. now = dt.datetime.now()
  242. yolo = now.strftime("%Y_%m_%d_%H_%M_%S_%f")
  243. pers = ET.SubElement(main, 'Pers', id=unicode(employee['id']), operation='merge')
  244. user_is_enabled = True if employee['access_rule'] else False
  245. company = ET.SubElement(pers, 'Company', id=company_id, operation='merge')
  246. site = ET.SubElement(company, 'Site', id=site_id, operation='merge')
  247. ET.SubElement(site, 'Status').text = 'Enabled' if user_is_enabled else 'Disabled'
  248. for r1 in range(1, 6):
  249. ET.SubElement(pers, 'Card', id=unicode(r1), operation='delete')
  250. for r2 in range(1, 6):
  251. ET.SubElement(site, 'Access-Rule', id=unicode(r2), operation='delete')
  252.  
  253. xml_file = open(settings.XML_DIR + '{}.xfer'.format(yolo), 'w')
  254. root.write(xml_file, encoding='ISO-8859-2', xml_declaration=True)
  255. xml_file.close()
  256. os.rename(settings.XML_DIR + '{}.xfer'.format(yolo),
  257. settings.XML_DIR + '{}.new'.format(yolo))
  258.  
  259. for user in employees:
  260. name = user['full_name'].split(' ')
  261. last_name = name[0] if len(name) > 0 else ''
  262. first_name = name[1] if len(name) > 1 else ''
  263. if len(name) > 2:
  264. first_name += ' ' + name[2]
  265.  
  266. user_is_enabled = True if user['access_rule'] else False
  267.  
  268. pers = ET.SubElement(main, 'Pers', id=unicode(user['id']), operation='merge')
  269. ET.SubElement(pers, 'Last-Name').text = last_name
  270. ET.SubElement(pers, 'First-Name').text = first_name
  271. ET.SubElement(pers, 'Access-Type').text = 'Pers'
  272. ET.SubElement(pers, 'Status').text = 'Enabled' if user_is_enabled else 'Disabled'
  273.  
  274. if user['proxi']:
  275. proxies = user['proxi'].split(', ')
  276. for n, proxi in enumerate([p for p in proxies if len(p) < 11]):
  277. if n + 1 < 6:
  278. cards = ET.SubElement(pers, 'Card', id=unicode(n + 1), operation='insert')
  279. ET.SubElement(cards, 'Number').text = unicode(proxi)
  280.  
  281. company = ET.SubElement(pers, 'Company', id=company_id, operation='merge')
  282. ET.SubElement(company, 'Status').text = 'Enabled' if user_is_enabled else 'Disabled'
  283. site = ET.SubElement(company, 'Site', id=site_id, operation='merge')
  284. ET.SubElement(site, 'Status').text = 'Enabled' if user_is_enabled else 'Disabled'
  285.  
  286. # for r2 in range(1, 6):
  287. # ET.SubElement(site, 'Access-Rule', id=unicode(r2), operation='delete')
  288. if user_is_enabled:
  289. for count, elem in enumerate(user['access_rule']):
  290. rule = ET.SubElement(site, 'Access-Rule', id=unicode(count + 1),
  291. operation='insert')
  292. ET.SubElement(rule, 'Rule').text = unicode(elem)
  293. ET.SubElement(rule, 'Start-Date').text = unicode(start.strftime('%Y/%m/%d'))
  294. ET.SubElement(rule, 'End-Date').text = unicode(end.strftime('%Y/%m/%d'))
  295. ET.SubElement(rule, 'Start-Time').text = unicode(start.strftime('%H:%M'))
  296. ET.SubElement(rule, 'End-Time').text = unicode(end.strftime('%H:%M'))
  297.  
  298. xml_file = open(settings.XML_DIR + '{}.xfer'.format(file_name), 'w')
  299. root.write(xml_file, encoding='ISO-8859-2', xml_declaration=True)
  300. xml_file.close()
  301. os.rename(settings.XML_DIR + '{}.xfer'.format(file_name),
  302. settings.XML_DIR + '{}.new'.format(file_name))
  303.  
  304. return Response(status=status.HTTP_200_OK)
  305.  
  306.  
  307. class VisitorXmlImportApiView(APIView):
  308. def post(self, request):
  309. data = request.data
  310. visitor = data['visitor']
  311.  
  312. now = dt.datetime.now()
  313.  
  314. file_name = now.strftime("%Y_%m_%d_%H_%M_%S_%f")
  315.  
  316. main = ET.Element('Import')
  317. root = ET.ElementTree(main)
  318.  
  319. company_id = unicode(data['company_id'])
  320. site_id = unicode(data['site_id'])
  321.  
  322. name = visitor['full_name'].split(' ')
  323. last_name = name[0] if len(name) > 0 else ''
  324. first_name = name[1] if len(name) > 1 else ''
  325. if len(name) > 2:
  326. first_name += ' ' + name[2]
  327.  
  328. user_is_enabled = True if visitor['access_rule'] else False
  329.  
  330. pers = ET.SubElement(main, 'Pers', id=unicode(visitor['id']), operation='merge')
  331. ET.SubElement(pers, 'Last-Name').text = last_name
  332. ET.SubElement(pers, 'First-Name').text = first_name
  333. ET.SubElement(pers, 'Access-Type').text = 'Pers'
  334. ET.SubElement(pers, 'Status').text = 'Enabled' if user_is_enabled else 'Disabled'
  335.  
  336. for r1 in range(1, 6):
  337. ET.SubElement(pers, 'Card', id=unicode(r1), operation='delete')
  338. if visitor['proxi']:
  339. proxies = visitor['proxi'].split(', ')
  340. for n, proxi in enumerate([p for p in proxies if len(p) < 11]):
  341. if n + 1 < 6:
  342. cards = ET.SubElement(pers, 'Card', id=unicode(n + 1), operation='insert')
  343. ET.SubElement(cards, 'Number').text = unicode(proxi)
  344.  
  345. company = ET.SubElement(pers, 'Company', id=company_id, operation='merge')
  346. ET.SubElement(company, 'Status').text = 'Enabled' if user_is_enabled else 'Disabled'
  347. site = ET.SubElement(company, 'Site', id=site_id, operation='merge')
  348. ET.SubElement(site, 'Status').text = 'Enabled' if user_is_enabled else 'Disabled'
  349.  
  350. for r2 in range(1, 6):
  351. ET.SubElement(site, 'Access-Rule', id=unicode(r2), operation='delete')
  352. if user_is_enabled:
  353. for count, elem in enumerate(visitor['access_rule']):
  354. rule = ET.SubElement(site, 'Access-Rule', id=unicode(count + 1),
  355. operation='insert')
  356. ET.SubElement(rule, 'Rule').text = unicode(elem)
  357. ET.SubElement(rule, 'Start-Date').text = unicode(visitor['start_date'])
  358. ET.SubElement(rule, 'End-Date').text = unicode(visitor['end_date'])
  359. ET.SubElement(rule, 'Start-Time').text = unicode(visitor['start_time'])
  360. ET.SubElement(rule, 'End-Time').text = unicode(visitor['end_time'])
  361.  
  362. xml_file = open(settings.XML_DIR + '{}.xfer'.format(file_name), 'w')
  363. root.write(xml_file, encoding='ISO-8859-2', xml_declaration=True)
  364. xml_file.close()
  365. os.rename(settings.XML_DIR + '{}.xfer'.format(file_name),
  366. settings.XML_DIR + '{}.new'.format(file_name))
  367.  
  368. return Response(status=status.HTTP_200_OK)
  369.  
  370.  
  371. class EmployeeDeleteXmlImportApiView(APIView):
  372. def post(self, request):
  373. data = request.data
  374. employee = data['employee']
  375.  
  376. if not self.employee_is_exist(employee['id']):
  377. return Response(status=status.HTTP_204_NO_CONTENT)
  378.  
  379. now = dt.datetime.now()
  380.  
  381. file_name = now.strftime("%Y_%m_%d_%H_%M_%S_%f")
  382.  
  383. main = ET.Element('Import')
  384. root = ET.ElementTree(main)
  385.  
  386. pers = ET.SubElement(main, 'Pers', id=unicode(employee['id']), operation='delete')
  387. for r1 in range(1, 6):
  388. ET.SubElement(pers, 'Card', id=unicode(r1), operation='delete')
  389.  
  390. xml_file = open(settings.XML_DIR + '{}.xfer'.format(file_name), 'w')
  391. root.write(xml_file, encoding='ISO-8859-2', xml_declaration=True)
  392. xml_file.close()
  393. os.rename(settings.XML_DIR + '{}.xfer'.format(file_name),
  394. settings.XML_DIR + '{}.new'.format(file_name))
  395.  
  396. return Response(status=status.HTTP_200_OK)
  397.  
  398. def employee_is_exist(self, employee_id):
  399. try:
  400. return idtech_models.PersSign.objects.get(pk=employee_id)
  401. except ObjectDoesNotExist:
  402. return None
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement