Commit fafd18bd370776369f506f62bc86ffa09deb82ac

Authored by pyros_astroguita
1 parent ef35b851
Exists in dev

add quota related methods

src/core/pyros_django/dashboard/templates/dashboard/observation_index.html
... ... @@ -102,6 +102,24 @@
102 102 </a>
103 103 </div>
104 104 </li>
  105 + <li>
  106 + {% comment %}
  107 + Old version to be remastered :
  108 + <a href="{% url "proposal" %}">
  109 + <div class="all-info">
  110 +
  111 + <h3>Proposal</h3>
  112 + {% load static %} <img src="{% static "media/proposal.png" %}" alt="html5" height="180" width="180" />
  113 + </div></a>
  114 + {% endcomment %}
  115 + <div class="all-info">
  116 + <a href="{% url "quota_sp" %}">
  117 +
  118 + <h3>Quota Scientific programs</h3>
  119 + {% load static %} <img src="{% static "media/proposal.png" %}" alt="html5" />
  120 + </a>
  121 + </div>
  122 + </li>
105 123 {% endif %}
106 124 {# TBD #}
107 125 {% if USER_LEVEL|ifinlist:"Admin,Operator,Unit-PI,Management board member,Observer,TAC" %}
... ...
src/core/pyros_django/scp_mgmt/A_SCP_Manager.py
... ... @@ -19,6 +19,7 @@ for short_path in short_paths:
19 19 from majordome.agent.Agent import Agent, build_agent
20 20 from user_mgmt.models import PyrosUser, Institute, SP_Period, Period, SP_Period, SP_Period_Guest, SP_PeriodWorkflow
21 21 import vendor.guitastro.src.guitastro as guitastro
  22 +from scp_mgmt.models import Quota
22 23  
23 24 # Django imports
24 25 from django.shortcuts import reverse
... ... @@ -47,6 +48,9 @@ class A_SCP_Manager(Agent):
47 48 # Format : “cmd_name” : (timeout, exec_mode, tooltip)
48 49  
49 50 "do_generate_ephem_moon_and_sun_for_period": (3, Agent.EXEC_MODE.SEQUENTIAL, 'generate ephem of moon & sun for a period'),
  51 + "do_set_quota_for_SP": (60, Agent.EXEC_MODE.SEQUENTIAL, 'set quota for scientific programs for id period'),
  52 + "do_set_quota_for_institutes": (60, Agent.EXEC_MODE.SEQUENTIAL, 'set quota for institutes for id period'),
  53 + "do_run_quota_workflow": (60, Agent.EXEC_MODE.SEQUENTIAL, 'set quota for a period'),
50 54 }
51 55  
52 56 # new init with obsconfig
... ... @@ -229,8 +233,8 @@ class A_SCP_Manager(Agent):
229 233 self.send_mail_to_observers_for_notification(next_sp_to_be_notified)
230 234 SP_PeriodWorkflow.objects.create(period=self.period,action=SP_PeriodWorkflow.NOTIFICATION)
231 235 self.update_sun_moon_ephems()
232   - self.set_quota_for_institutes(self.period.id)
233   - self.set_quota_for_sp(self.period.id)
  236 + self.do_set_quota_for_institutes(self.period.id)
  237 + self.do_set_quota_for_SP(self.period.id)
234 238  
235 239 def routine_process_body(self):
236 240 print("routine automatic period workflow")
... ... @@ -245,27 +249,49 @@ class A_SCP_Manager(Agent):
245 249 for n in range(int((end_date - start_date).days)):
246 250 yield start_date + timedelta(n)
247 251  
248   - def set_quota_for_institutes(self, id_period):
249   - for institute in Institute.objects.all():
250   - quota_f = institute.quota_f
251   - # the lowest id of quota table for this period should be the first night of the period
252   - period_quota = Period.objects.get(id=id_period).quota
253   - institute_quota = period_quota.convert_to_quota(quota_f)
254   - new_quota = Quota()
255   - new_quota.set_attributes_and_save(institute_quota)
256   - institute.quota = new_quota
257   - institute.save()
  252 + def do_run_quota_workflow(self, id_period:int):
  253 + try:
  254 + self.update_sun_moon_ephems()
  255 + except Exception as e:
  256 + print(e)
  257 + self.do_set_quota_for_institutes(id_period)
  258 + self.do_set_quota_for_SP(id_period)
  259 +
  260 + def do_set_quota_for_institutes(self, id_period:int):
  261 + try:
  262 + for institute in Institute.objects.all():
  263 + quota_f = institute.quota_f
  264 + # the lowest id of quota table for this period should be the first night of the period
  265 + period_quota = Period.objects.get(id=id_period).quota
  266 + institute_quota = period_quota.convert_to_quota(quota_f)
  267 + institute_quota["night_id"] = 0
  268 + institute_quota["id_period"] = id_period
  269 + new_quota = Quota()
  270 + new_quota.set_attributes_and_save(institute_quota)
  271 + institute.quota = new_quota
  272 + institute.save()
  273 + except Exception as e:
  274 + print(e)
  275 + raise e
258 276  
259   - def set_quota_for_SP(self, id_period):
260   - period = Period.objects.get(id=id_period)
261   - for sp_period in SP_Period.objects.filter(period=period):
262   - sp = sp_period.scientific_program
263   - institute = sp.institute
264   - institute_quota = institute.quota
265   - new_quota = Quota()
266   - quota_attributes = institute_quota.convert_to_quota(sp.quota_f)
267   - new_quota.set_attributes_and_save(quota_attributes)
268   -
  277 + def do_set_quota_for_SP(self, id_period:int):
  278 + try:
  279 + period = Period.objects.get(id=id_period)
  280 + for sp_period in SP_Period.objects.filter(period=period):
  281 + sp = sp_period.scientific_program
  282 + institute = sp.institute
  283 + institute_quota = institute.quota
  284 + new_quota = Quota()
  285 + quota_attributes = institute_quota.convert_to_quota(sp.quota_f)
  286 + quota_attributes["night_id"] = 1
  287 + quota_attributes["id_period"] = id_period
  288 + new_quota.set_attributes_and_save(quota_attributes)
  289 + sp.quota = new_quota
  290 + sp.save()
  291 +
  292 + except Exception as e:
  293 + print(e)
  294 + raise e
269 295  
270 296 if __name__ == "__main__":
271 297  
... ...
src/core/pyros_django/scp_mgmt/models.py
... ... @@ -4,90 +4,114 @@ from django.db import models
4 4 class Quota(models.Model):
5 5 id_period = models.BigIntegerField(blank=True, null=True)
6 6 night_id = models.CharField(max_length=8, null=True, blank=True, db_index=True)
  7 + d_total = models.BigIntegerField(default=0, blank=True, null=True)
7 8 d_totalq = models.BigIntegerField(default=0, blank=True, null=True)
8 9 d_totalx = models.BigIntegerField(default=0, blank=True, null=True)
9 10  
  11 + d_previous = models.BigIntegerField(default=0, blank=True, null=True)
10 12 d_previousq = models.BigIntegerField(default=0, blank=True, null=True)
11 13 d_previousx = models.BigIntegerField(default=0, blank=True, null=True)
12 14  
  15 + d_current = models.BigIntegerField(default=0, blank=True, null=True)
13 16 d_currentq = models.BigIntegerField(default=0, blank=True, null=True)
14 17 d_currentx = models.BigIntegerField(default=0, blank=True, null=True)
15 18  
  19 + d_passed = models.BigIntegerField(default=0, blank=True, null=True)
16 20 d_passedq = models.BigIntegerField(default=0, blank=True, null=True)
17 21 d_passedx = models.BigIntegerField(default=0, blank=True, null=True)
18 22  
  23 + d_schedule = models.BigIntegerField(default=0, blank=True, null=True)
19 24 d_scheduleq = models.BigIntegerField(default=0, blank=True, null=True)
20 25 d_schedulex = models.BigIntegerField(default=0, blank=True, null=True)
21 26  
  27 + d_next = models.BigIntegerField(default=0, blank=True, null=True)
22 28 d_nextq = models.BigIntegerField(default=0, blank=True, null=True)
23 29 d_nextx = models.BigIntegerField(default=0, blank=True, null=True)
24 30  
25   - @property
26   - def d_total(self):
27   - return self.d_totalq + self.d_totalx
  31 + # @property
  32 + # def d_total(self):
  33 + # return self.d_totalq + self.d_totalx
28 34  
29   - @property
30   - def d_previous(self):
31   - return self.d_previousq + self.d_previousx
  35 + # @property
  36 + # def d_previous(self):
  37 + # return self.d_previousq + self.d_previousx
32 38  
33   - @property
34   - def d_current(self):
35   - return self.d_currentq + self.d_currentx
  39 + # @property
  40 + # def d_current(self):
  41 + # return self.d_currentq + self.d_currentx
36 42  
37   - @property
38   - def d_passed(self):
39   - return self.d_passedq + self.d_passedx
  43 + # @property
  44 + # def d_passed(self):
  45 + # return self.d_passedq + self.d_passedx
40 46  
41   - @property
42   - def d_schedule(self):
43   - return self.d_scheduleq + self.d_schedulex
  47 + # @property
  48 + # def d_schedule(self):
  49 + # return self.d_scheduleq + self.d_schedulex
44 50  
45   - @property
46   - def d_next(self):
47   - return self.d_nextq + self.d_nextx
  51 + # @property
  52 + # def d_next(self):
  53 + # return self.d_nextq + self.d_nextx
48 54  
49 55 def set_attributes_and_save(self, quota_attributes:dict):
50   -
51 56 if quota_attributes.get("id_period") != None:
52 57 self.id_period = quota_attributes["id_period"]
53 58 if quota_attributes.get("night_id") != None:
54 59 self.night_id = quota_attributes["night_id"]
  60 +
55 61 if quota_attributes.get("d_totalq") != None:
56 62 self.d_totalq = quota_attributes["d_totalq"]
57 63 if quota_attributes.get("d_totalx") != None:
58 64 self.d_totalx = quota_attributes["d_totalx"]
  65 +
59 66 if quota_attributes.get("d_previousq") != None:
60 67 self.d_previousq = quota_attributes["d_previousq"]
61 68 if quota_attributes.get("d_previousx") != None:
62 69 self.d_previousx = quota_attributes["d_previousx"]
  70 +
63 71 if quota_attributes.get("d_currentq") != None:
64 72 self.d_currentq = quota_attributes["d_currentq"]
65 73 if quota_attributes.get("d_currentx") != None:
66 74 self.d_currentx = quota_attributes["d_currentx"]
  75 +
  76 + if quota_attributes.get("d_passedq") != None:
  77 + self.d_passedq = quota_attributes["d_passedq"]
  78 + if quota_attributes.get("d_passedx") != None:
  79 + self.d_passedx = quota_attributes["d_passedx"]
  80 +
  81 +
67 82 if quota_attributes.get("d_scheduleq") != None:
68 83 self.d_scheduleq = quota_attributes["d_scheduleq"]
69 84 if quota_attributes.get("d_schedulex") != None:
70   - self.d_schedule = quota_attributes["d_schedulex"]
  85 + self.d_schedulex = quota_attributes["d_schedulex"]
  86 +
  87 + if quota_attributes.get("d_nextx") != None:
  88 + self.d_nextq = quota_attributes["d_nextx"]
71 89 if quota_attributes.get("d_nextq") != None:
72 90 self.d_nextq = quota_attributes["d_nextq"]
73   - if quota_attributes.get("d_nextx") != None:
74   - self.d_nextx = quota_attributes["d_nextx"]
  91 +
  92 +
  93 + if quota_attributes.get("d_total") != None:
  94 + self.d_total = quota_attributes["d_total"]
  95 + if quota_attributes.get("d_previous") != None:
  96 + self.d_previous = quota_attributes["d_previous"]
  97 + if quota_attributes.get("d_current") != None:
  98 + self.d_current = quota_attributes["d_current"]
  99 + if quota_attributes.get("d_passed") != None:
  100 + self.d_passed = quota_attributes["d_passed"]
  101 + if quota_attributes.get("d_schedule") != None:
  102 + self.d_schedule = quota_attributes["d_schedule"]
  103 + if quota_attributes.get("d_next") != None:
  104 + self.d_next = quota_attributes["d_next"]
75 105 self.save()
76 106  
77 107 def convert_to_quota(self, quota_f):
78 108 quota_institute = {}
79 109  
80   - quota_institute["d_totalq"] = self.d_totalq * quota_f
81   - quota_institute["d_totalx"] = self.d_totalx * quota_f
82   - quota_institute["d_previousq"] = self.d_previousq * quota_f
83   - quota_institute["d_previousx"] = self.d_previousx * quota_f
84   - quota_institute["d_currentq"] = self.d_currentq * quota_f
85   - quota_institute["d_currentx"] = self.d_currentx * quota_f
86   - quota_institute["d_passedq"] = self.d_passedq * quota_f
87   - quota_institute["d_passedx"] = self.d_passedx * quota_f
88   - quota_institute["d_scheduleq"] = self.d_scheduleq * quota_f
89   - quota_institute["d_schedulex"] = self.d_schedulex * quota_f
90   - quota_institute["d_nextq"] = self.d_nextq * quota_f
91   - quota_institute["d_nextx"] = self.d_nextx * quota_f
  110 + quota_institute["d_total"] = self.d_total * quota_f
  111 + quota_institute["d_previous"] = self.d_previous * quota_f
  112 + quota_institute["d_current"] = self.d_current * quota_f
  113 + quota_institute["d_passed"] = self.d_passed * quota_f
  114 + quota_institute["d_schedule"] = self.d_schedule * quota_f
  115 + quota_institute["d_next"] = self.d_next * quota_f
92 116  
93 117 return quota_institute
... ...
src/core/pyros_django/scp_mgmt/views.py
... ... @@ -815,7 +815,8 @@ def quota_sp(request):
815 815 config = OBSConfig(os.environ["PATH_TO_OBSCONF_FILE"],os.environ["unit_name"])
816 816 current_night = config.fn.date2night("now")
817 817 current_period = Period.objects.exploitation_period()
818   - quota_current_night = Quota.objects.get(id_period=current_period.id, night_id=current_night)
  818 + # lowest id is period line
  819 + quota_current_night = Quota.objects.filter(id_period=current_period.id, night_id=current_night).order_by("id").first()
819 820 return render(request, 'scp_mgmt/quota_sp.html', locals())
820 821  
821 822  
... ...