Advertisement
Guest User

Untitled

a guest
Mar 28th, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 14.51 KB | None | 0 0
  1. # coding=utf-8 #
  2. from openerp import models, exceptions, fields, api
  3. import datetime
  4. import math
  5.  
  6.  
  7. class Lesson(models.Model):
  8.     _name = 'kspu.table.lesson'
  9.     _rec_name = 'subject'
  10.  
  11.     subject = fields.Many2one(string=u'Название предмета', comodel_name='kspu.table.subject', required=True)
  12.     type = fields.Selection(selection=[
  13.         ('lecture', u'Лекция'),
  14.         ('seminar', u'Семинар'),
  15.         ('lab', u'Лабораторное занятие'),
  16.         ('individual', u'Индивидуальная работа'),
  17.     ], string=u'Тип', required=True, default='lecture')
  18.     validity_from = fields.Datetime(
  19.         string=u'Дата и время начала', default=lambda *a: datetime.datetime.now().strftime('%Y-%m-%d'),
  20.         required=True)
  21.     validity_to = fields.Datetime(
  22.         string=u'Дата и время окончания',
  23.         default=lambda *a: (datetime.datetime.now() + datetime.timedelta(hours=1.5)).strftime('%Y-%m-%d'),
  24.         required=True)
  25.     # lesson_number_show = fields.Selection(selection=[
  26.     #     ('one', u'1 лента (8.40 - 10.10)'),
  27.     #     ('two', u'2 лента (10.20 - 11.50)'),
  28.     #     ('three', u'3 лента (12.20 - 13.50)'),
  29.     #     ('four', u'4 лента (14.00 - 15.30)'),
  30.     #     ('five', u'5 лента (15.40- 17.10)'),
  31.     #     ('six', u'6 лента (17.20- 18.50)'),
  32.     #     ('seven', u'7 лента (19.00- 20.30)'),
  33.     #     ('eight', u'8 лента (20.40- 22.10)'),
  34.     # ], string=u'Лента', required=True)
  35.     lesson_number_show = fields.Many2one(string=u'Лента', comodel_name='kspu.table.slots', required=True)
  36.     lesson_date_show = fields.Date(string=u'Дата занятия', required=True)
  37.     lesson_validity = fields.Char(string=u'Время по номеру ленты', compute='datetime_on_number', store=True)
  38.     lesson_number = fields.Char(string=u'Номер ленты по времени ленты', compute='number_on_datetime', store=True)
  39.     lesson_date = fields.Char(string=u'Дата по времени ленты', compute='date_on_datetime', store=True)
  40.     level = fields.Selection(string=u'Курс', related='group.level', required=True)
  41.     group = fields.Many2one(string=u'Группа', comodel_name='kspu.table.group', required=True)
  42.     subgroup = fields.Selection(selection=[
  43.         ('full', u'Полная'),
  44.         ('A', u'подгруппа A'),
  45.         ('B', u'подгруппа B'),
  46.     ], string=u'Подгруппа', default='full', required=True)
  47.     department = fields.Many2one(string=u'Факультет', related='group.department')
  48.     amount = fields.Integer(string=u'Численность группы', related='group.amount')
  49.     teacher = fields.Many2one(string=u'Преподаватель', comodel_name='kspu.table.teacher', required=True)
  50.     cabinet = fields.Many2one(string=u'Аудитория', comodel_name='kspu.table.cabinet', required=True)
  51.     roominess = fields.Char(string=u'Вместительность', related='cabinet.roominess')
  52.     week_number = fields.Char(string=u'Номер недели', compute='compute_week', store=True)
  53.     week_show = fields.Char(string=u'Неделя', compute='compute_week')
  54.  
  55.     # Недели
  56.     @api.one
  57.     @api.depends('validity_from')
  58.     def compute_week(self):
  59.         self.week_number = fields.Date.from_string(self.validity_from).isocalendar()[1]
  60.         validity_from_dt = fields.Datetime.from_string(self.validity_from)
  61.  
  62.         week_from = datetime.datetime.strptime(
  63.             (str(validity_from_dt.year) + "." + str(self.week_number) + "." + str(1)), "%Y.%W.%w")
  64.         week_to = datetime.datetime.strptime(
  65.             (str(validity_from_dt.year) + "." + str(self.week_number) + "." + str(0)), "%Y.%W.%w")
  66.         self.week_show = u'{0} неделя (с {1} по {2})'.format(
  67.             self.week_number, week_from.strftime('%d.%m.%Y'), week_to.strftime('%d.%m.%Y'))
  68.  
  69.     # Логика лент
  70.     @api.one
  71.     @api.constrains('lesson_number_show')
  72.     def datetime_on_number(self):
  73.         current_lesson_number = self.lesson_number_show
  74.         current_time_start = self.check_time_start
  75.         current_time_end = self.check_time_end
  76.         lesson_date_d = fields.Date.from_string(self.lesson_date_show)
  77.  
  78.  
  79.         # for current_lesson_number:
  80.         #     if self.validity_from != fields.Datetime.to_string(datetime.datetime(
  81.         #             lesson_date_d.year, lesson_date_d.month, lesson_date_d.day, 1, 40, 0)):
  82.         #         self.validity_from = fields.Datetime.to_string(datetime.datetime(
  83.         #             lesson_date_d.year, lesson_date_d.month, lesson_date_d.day, 1, 40, 0))
  84.         #     if self.validity_to != fields.Datetime.to_string(datetime.datetime(
  85.         #             lesson_date_d.year, lesson_date_d.month, lesson_date_d.day, 3, 10, 0)):
  86.         #         self.validity_to = fields.Datetime.to_string(datetime.datetime(
  87.         #             lesson_date_d.year, lesson_date_d.month, lesson_date_d.day, 3, 10, 0))
  88.  
  89.     @api.one
  90.     @api.constrains('validity_from')
  91.     def number_on_datetime(self):
  92.         validity_from_dt = fields.Datetime.from_string(self.validity_from)
  93.  
  94.         if (validity_from_dt.hour < 3) or (validity_from_dt.hour == 3 and validity_from_dt.minute <= 10):
  95.             self.lesson_number_show = 'one'
  96.         if (validity_from_dt.hour == 3 and validity_from_dt.minute > 10) or (
  97.                         validity_from_dt.hour == 4 and validity_from_dt.minute <= 50):
  98.             self.lesson_number_show = 'two'
  99.         if (validity_from_dt.hour == 4 and validity_from_dt.minute > 50) or (validity_from_dt.hour == 5) or (
  100.                         validity_from_dt.hour == 6 and validity_from_dt.minute <= 50):
  101.             self.lesson_number_show = 'three'
  102.         if (validity_from_dt.hour == 6 and validity_from_dt.minute > 50) or (validity_from_dt.hour == 7) or (
  103.                         validity_from_dt.hour == 8 and validity_from_dt.minute <= 30):
  104.             self.lesson_number_show = 'four'
  105.         if (validity_from_dt.hour == 8 and validity_from_dt.minute > 30) or (validity_from_dt.hour == 9) or (
  106.                         validity_from_dt.hour == 10 and validity_from_dt.minute <= 10):
  107.             self.lesson_number_show = 'five'
  108.         if (validity_from_dt.hour == 10 and validity_from_dt.minute > 10) or (
  109.                         validity_from_dt.hour == 11 and validity_from_dt.minute <= 50):
  110.             self.lesson_number_show = 'six'
  111.         if (validity_from_dt.hour == 11 and validity_from_dt.minute > 50) or (validity_from_dt.hour == 12) or (
  112.                         validity_from_dt.hour == 13 and validity_from_dt.minute <= 30):
  113.             self.lesson_number_show = 'seven'
  114.         if (validity_from_dt.hour == 13 and validity_from_dt.minute > 30) or (validity_from_dt.hour == 14) or (
  115.                         validity_from_dt.hour == 15) or (validity_from_dt.hour == 16):
  116.             self.lesson_number_show = 'eight'
  117.  
  118.     @api.one
  119.     @api.constrains('validity_from')
  120.     def date_on_datetime(self):
  121.         validity_from_dt = fields.Datetime.from_string(self.validity_from)
  122.  
  123.         self.lesson_date_show = datetime.date(validity_from_dt.year, validity_from_dt.month, validity_from_dt.day)
  124.  
  125.     @api.one
  126.     @api.constrains('lesson_date_show')
  127.     def datetime_on_date(self):
  128.         validity_from_dt = fields.Datetime.from_string(self.validity_from)
  129.         lesson_date_show = fields.Date.from_string(self.lesson_date_show)
  130.         new_validity_from = datetime.datetime(lesson_date_show.year, lesson_date_show.month, lesson_date_show.day,
  131.                                               validity_from_dt.hour, validity_from_dt.minute)
  132.  
  133.         if validity_from_dt != new_validity_from:
  134.             self.validity_from = new_validity_from
  135.  
  136.     # Проверка коллизий
  137.     @api.one
  138.     @api.constrains('teacher', 'cabinet', 'validity_from')
  139.     def check_teacher_bifurcation(self):
  140.         lesson_ids = self.env['kspu.table.lesson'].search(
  141.             [('teacher', '=', self.teacher.id), ('validity_from', '=', self.validity_from),
  142.              ('cabinet', '!=', self.cabinet.id), ('id', '!=', self.id)])
  143.         if len(lesson_ids):
  144.             raise exceptions.ValidationError(
  145.                 u"Ошибка: у данного преподавателя уже есть лента в другом кабинете в это время")
  146.  
  147.     @api.one
  148.     @api.constrains('teacher', 'cabinet', 'validity_from')
  149.     def check_teacher_intersection(self):
  150.         lesson_ids = self.env['kspu.table.lesson'].search(
  151.             [('teacher', '!=', self.teacher.id), ('validity_from', '=', self.validity_from),
  152.              ('cabinet', '=', self.cabinet.id), ('id', '!=', self.id)])
  153.         if len(lesson_ids):
  154.             raise exceptions.ValidationError(
  155.                 u"Ошибка: разные преподаватели не могут быть в одном кабинете в одно время")
  156.  
  157.     @api.one
  158.     @api.constrains('subject', 'group', 'teacher', 'cabinet', 'validity_from')
  159.     def check_complete_coincidence(self):
  160.         lesson_ids = self.env['kspu.table.lesson'].search(
  161.             [('teacher', '=', self.teacher.id), ('validity_from', '=', self.validity_from),
  162.              ('cabinet', '=', self.cabinet.id), ('id', '!=', self.id), ('subject', '=', self.subject.id),
  163.              ('group', '=', self.group.id), ('subgroup', '=', self.subgroup)])
  164.         if len(lesson_ids):
  165.             raise exceptions.ValidationError(
  166.                 u"Ошибка: полное совпадение лент")
  167.  
  168.     @api.one
  169.     @api.constrains('subject', 'cabinet', 'validity_from')
  170.     def check_lesson_intersection(self):
  171.         lesson_ids = self.env['kspu.table.lesson'].search(
  172.             [('subject', '!=', self.subject.id), ('validity_from', '=', self.validity_from),
  173.              ('cabinet', '=', self.cabinet.id), ('id', '!=', self.id)])
  174.         if len(lesson_ids):
  175.             raise exceptions.ValidationError(
  176.                 u"Ошибка: разные предметы не могут проходить в одном кабинете в одно время")
  177.  
  178.  
  179. class Subject(models.Model):
  180.     _name = 'kspu.table.subject'
  181.     _rec_name = 'name'
  182.  
  183.     name = fields.Char(string=u'Название предмета')
  184.     lesson_id = fields.One2many(comodel_name='kspu.table.lesson', inverse_name='subject')
  185.  
  186.  
  187. class Teacher(models.Model):
  188.     _name = 'kspu.table.teacher'
  189.     _rec_name = 'full_name'
  190.  
  191.     name = fields.Char(string=u'Имя преподавателя')
  192.     lesson_id = fields.One2many(comodel_name='kspu.table.lesson', inverse_name='teacher')
  193.     subdep = fields.Char(string=u'Кафедра')
  194.     full_name = fields.Char(string=u'ФИО + Кафедра', compute="_full_name", search="_search_full_name")
  195.  
  196.  
  197.     @api.one
  198.     @api.depends('name', 'subdep')
  199.     def _full_name(self):
  200.         self.full_name = u'%s (%s)' % (self.name, self.subdep)
  201.  
  202.     def _search_full_name(self, operator, value):
  203.         if operator == 'like':
  204.             operator = 'ilike'
  205.  
  206.         return ['|', '|',
  207.                 ('name', operator, value),
  208.                 ('subdep', operator, value)
  209.                 ]
  210.  
  211.  
  212. class Cabinet(models.Model):
  213.     _name = 'kspu.table.cabinet'
  214.     _rec_name = 'name'
  215.  
  216.     name = fields.Char(string=u'Номер аудитории')
  217.     roominess = fields.Char(string=u'Вместительность')
  218.     lesson_id = fields.One2many(comodel_name='kspu.table.lesson', inverse_name='cabinet')
  219.  
  220.  
  221. class Group(models.Model):
  222.     _name = 'kspu.table.group'
  223.     _rec_name = 'name'
  224.  
  225.     name = fields.Char(string=u'Номер группы', required=True)
  226.     amount = fields.Integer(string=u'Численность группы')
  227.     lesson_id = fields.One2many(comodel_name='kspu.table.lesson', inverse_name='group')
  228.     department = fields.Many2one(string=u'Факультет', comodel_name='kspu.table.department', required=True)
  229.     level = fields.Selection(selection=[
  230.         ('one', u'1 курс'),
  231.         ('two', u'2 курс'),
  232.         ('three', u'3 курс'),
  233.         ('four', u'4 курс'),
  234.         ('five', u'5 курс'),
  235.         ('six', u'6 курс'),
  236.         ('one_master', u'1 курс магистратуры'),
  237.         ('two_master', u'2 курс магистратуры'),
  238.         ('one_postgraduate', u'1 курс аспирантуры'),
  239.         ('two_postgraduate', u'2 курс аспирантуры'),
  240.         ('three_postgraduate', u'3 курс аспирантуры'),
  241.     ], string=u'Курс', required=True)
  242.  
  243.     @api.model
  244.     def name_search(self, name='', args=None, operator='ilike', limit=100):
  245.         args.append(['department.user_id', '=', self.env.user.id])
  246.         return self._name_search(name, args, operator, limit=limit)
  247.  
  248.  
  249. class Department(models.Model):
  250.     _name = 'kspu.table.department'
  251.     _rec_name = 'name'
  252.  
  253.     name = fields.Char(string=u'Факультет')
  254.     group = fields.One2many(comodel_name='kspu.table.group', inverse_name='department')
  255.     user_id = fields.Many2many(string=u'Инженер расписания', comodel_name='res.users')
  256.  
  257.     @api.model
  258.     def name_search(self, name='', args=None, operator='ilike', limit=100):
  259.         args.append(['user_id', '=', self.env.user.id])
  260.         return self._name_search(name, args, operator, limit=limit)
  261.  
  262.  
  263. class User(models.Model):
  264.     _inherit = 'res.users'
  265.  
  266.     department = fields.Many2many(string=u'Факультет', comodel_name='kspu.table.department', ondelete='set null',
  267.                                   required=False)
  268.  
  269.     @api.model
  270.     def create(self, vals):
  271.         return super(User, self).create(vals)
  272.  
  273.  
  274. class Slots(models.Model):
  275.     _name = 'kspu.table.slots'
  276.  
  277.     name = fields.Char(string=u'Временной слот')
  278.     time_start = fields.Float(string=u'Время начала')
  279.     time_end = fields.Float(string=u'Время конца')
  280.     lesson_id = fields.One2many(comodel_name='kspu.table.lesson', inverse_name='lesson_number_show')
  281.  
  282.     @api.one
  283.     @api.onchange('time_start')
  284.     def check_time_start(self):
  285.         hour_start = int(math.floor(self.time_start))
  286.         minute_start = int(round((self.time_start % 1) * 60))
  287.  
  288.         print hour_start, minute_start
  289.         return hour_start, minute_start
  290.  
  291.     @api.one
  292.     @api.onchange('time_end')
  293.     def check_time_end(self):
  294.         hour_end = int(math.floor(self.time_end))
  295.         minute_end = int(round((self.time_end % 1) * 60))
  296.  
  297.         print hour_end, minute_end
  298.         return hour_end, minute_end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement