0001-agoraplus-add-periscol-inscriptions-endpoints-17429.patch
passerelle/contrib/agoraplus/models.py | ||
---|---|---|
87 | 87 |
def wrap_agora_array(response, msg): |
88 | 88 |
return wrap_agora(response, msg, expected_type=list) |
89 | 89 | |
90 |
@contextmanager |
|
91 |
def wrap_agora_periscol(response, msg): |
|
92 |
with wrap_agora_dict(response, msg): |
|
93 |
if response['TYPE_RESULT'] == 1: |
|
94 |
yield response['DATA'] |
|
95 |
elif response['TYPE_RESULT'] == -1: |
|
96 |
yield [] |
|
97 |
else: |
|
98 |
raise AgoraAPIError('failure %s: %r(%r)' % (msg, response['ERROR']['ID'], response['ERROR']['MESSAGE'])) |
|
99 | ||
90 | 100 | |
91 | 101 |
class AgoraPlus(BaseResource): |
92 | 102 |
url = models.CharField(max_length=128, blank=False, |
... | ... | |
779 | 789 |
if child_id.startswith('sas_'): |
780 | 790 |
return [] |
781 | 791 | |
782 |
with wrap_agora_array(self.request('enfants/%s/inscriptions_pe/' % child_id),
|
|
792 |
with wrap_agora_array(self.request('enfants/%s/inscriptions_pe/' % child_id), |
|
783 | 793 |
'to get plannings') as regs: |
784 | 794 |
plannings = [] |
785 | 795 |
now = datetime.now() |
... | ... | |
807 | 817 |
return [] |
808 | 818 |
return [normalize_school_enrollment(e) for e in enrollments] |
809 | 819 | |
820 |
def get_periscol_enrollments(self, child, service, name_id=None, date=None): |
|
821 |
if name_id and not self.child_in_name_id_family(name_id=name_id): |
|
822 |
raise AgoraAPIError('child not in this family') |
|
823 | ||
824 |
url = 'children/%s/inscriptions_periscol/' % child |
|
825 |
if service: |
|
826 |
url += '?p_id_service=' + service |
|
827 |
if date: |
|
828 |
url += '&p_date=' + date |
|
829 |
with wrap_agora_periscol(self.request(url), |
|
830 |
'to get periscol enrollments') as enrollments: |
|
831 |
return [normalize_periscol_enrollment(e) for e in enrollments['INSCRIPTION_INFO']] |
|
832 | ||
833 |
def get_periscol_enrollment_planning(self, enrollment_id): |
|
834 |
url = 'activities/%s/planning/' % enrollment_id |
|
835 |
with wrap_agora_periscol(self.request(url), |
|
836 |
'to get periscol enrollment planning') as planning: |
|
837 |
return [normalize_periscol_enrollment_planning(p) for p in planning['PLANNING_DAYS']] |
|
838 | ||
839 |
def get_periscol_child_enrollment_planning(self, child_id, enrollment_id, which=-1, name_id=None, |
|
840 |
start_date=None, end_date=None): |
|
841 |
if name_id and not self.child_in_name_id_family(name_id=name_id): |
|
842 |
raise AgoraAPIError('child not in this family') |
|
843 | ||
844 |
url = 'children/%s/inscriptions_periscol/%s/planning/?reserved_day=%s' % (child_id, enrollment_id, which) |
|
845 |
if start_date and end_date: |
|
846 |
url += '&start_date=%s&end_date=%s' % (start_date, end_date) |
|
847 |
with wrap_agora_periscol(self.request(url), |
|
848 |
'to get periscol child enrollment planning') as planning: |
|
849 |
return [normalize_periscol_enrollment_planning(p) for p in planning['PLANNING_DAYS']] |
|
850 | ||
851 |
def create_periscol_reservation(enrollment_id, date, tarif_id, majored): |
|
852 |
url = 'reservations_periscol/' |
|
853 |
data = {'ID_INSCRIPTION': enrollment_id, |
|
854 |
'DAY': date, |
|
855 |
'ID_DEF_TARIF': tarif_id, |
|
856 |
'MAJORED': majored} |
|
857 |
with wrap_agora_periscol(self.request(url, json=data), 'to add reservation') as reservation_add_result: |
|
858 |
return reservation_add_result |
|
859 | ||
860 |
def get_periscol_enrollment_reservations(self, enrollment_id): |
|
861 |
url = 'reservations_periscol/%s/reservations/' % enrollment_id |
|
862 |
with wrap_agora_periscol(self.request(url), |
|
863 |
'to get periscol enrollment reservations') as reservations: |
|
864 |
return [{'id': u'%s' % r['ID'], 'text': r['DAY']} for r in reservations['RESERVATION_LIST']] |
|
865 | ||
866 |
def delete_periscol_enrollment_reservation(self, reservation_id): |
|
867 |
url = 'reservations_periscol/' |
|
868 |
data = {"ID": int(reservation_id)} |
|
869 |
with wrap_agora_periscol(self.request(url, method='delete'), |
|
870 |
'to delete periscol reservation') as result: |
|
871 |
return result |
|
872 | ||
810 | 873 |
def get_invoices(self, login): |
811 | 874 |
if not login: # unlinked account |
812 | 875 |
return [] |
... | ... | |
878 | 941 |
return adult['original_id'] |
879 | 942 |
raise ObjectDoesNotExist(_('adult not in Agora+')) |
880 | 943 | |
944 |
def child_in_name_id_family(child_id, name_id): |
|
945 |
family = self.get_family(name_id=name_id) |
|
946 |
for child in family['children']: |
|
947 |
if child_id in child['id']: |
|
948 |
return True |
|
949 |
return False |
|
950 | ||
881 | 951 |
def update_phone_numbers(self, login, name_id, adult_id, |
882 | 952 |
new_phone_number, new_cellphone_number): |
883 | 953 |
family = self.get_agoraplus_family(login, raise_error=True) |
passerelle/contrib/agoraplus/normalize.py | ||
---|---|---|
366 | 366 |
'text': '%s, %s / %s, %s' % (child_fullname, school['name'], |
367 | 367 |
enrollment_level['name'], year['name']), |
368 | 368 |
} |
369 | ||
370 |
def normalize_periscol_enrollment(enrollment): |
|
371 |
return {'id': u'%s' % enrollment['ACTIVITY']['ID'], |
|
372 |
'text': enrollment['ACTIVITY']['DESCRIPTION'], |
|
373 |
'start_date': enrollment['START_DATE'], |
|
374 |
'end_date': enrollment['END_DATE']} |
|
375 | ||
376 |
def normalize_periscol_enrollment_planning(planning): |
|
377 |
text = '%s (%s-%s)' % (planning['DAY'], planning['START_TIME'], planning['END_TIME']) |
|
378 |
return {'id': planning['DAY'], 'text': text} |
passerelle/contrib/agoraplus/templates/passerelle/contrib/agoraplus/detail.html | ||
---|---|---|
203 | 203 |
</ul> |
204 | 204 |
</li> |
205 | 205 |
</ul> |
206 | ||
207 |
<h4>{% trans 'Periscol enrollments' %}</h4> |
|
208 |
<ul> |
|
209 |
<li> |
|
210 |
{% url 'agoraplus-child-periscol-enrollments' slug=object.slug child_id='child_id' service_id='service_id' as periscol_enrollments_url %} |
|
211 |
{% trans 'Get child periscol enrollments:' %} <a href="{{ periscol_enrollments_url }}">{{ site_base_uri }}{{ periscol_enrollments_url }}?NameID=…&date=2017-01-01</a> |
|
212 |
</li> |
|
213 |
<li> |
|
214 |
{% url 'agoraplus-enrollment-planning' slug=object.slug enrollment_id='enrollment_id' as periscol_enrollment_planning_url %} |
|
215 |
{% trans 'Get enrollment planning:' %} <a href="{{ periscol_enrollment_planning_url }}">{{ site_base_uri }}{{ periscol_enrollment_planning_url }}</a> |
|
216 |
</li> |
|
217 |
<li> |
|
218 |
{% url 'agoraplus-periscol-child-enrollment-planning' slug=object.slug child_id='child_id' enrollment_id='enrollment_id' which='days' as periscol_child_enrollment_planning_url %} |
|
219 |
{% trans 'Get child enrollment planning:' %} <a href="{{ periscol_child_enrollment_planning_url }}">{{ site_base_uri }}{{ periscol_child_enrollment_planning_url }}?NameID=…&start_date=2017-01-01&end_date=2017-12-31</a> — |
|
220 |
{% trans 'days:' %} |
|
221 |
<ul> |
|
222 |
<li><em>-1</em>: {% trans "all days" %}</li> |
|
223 |
<li><em>0</em>: {% trans "not reserved days" %}</li> |
|
224 |
<li><em>1</em>: {% trans "reserved days" %}</li> |
|
225 |
</ul> |
|
226 |
</li> |
|
227 |
<li> |
|
228 |
{% url 'agoraplus-periscol-add-reservation' slug=object.slug as periscol_add_reservation_url %} |
|
229 |
{% trans 'Add periscol reservation:' %} POST <a href="{{ periscol_add_reservation_url }}">{{ site_base_uri }}{{ periscol_add_reservation_url }}</a> — |
|
230 |
{% trans 'JSON payload:' %} |
|
231 |
<ul> |
|
232 |
<li><em>enrollment_id</em> {% trans 'enrollment id for a child' %}</li> |
|
233 |
<li><em>date</em> {% trans 'a date of enrollment planning' %}</li> |
|
234 |
<li><em>tarif_id</em> {% trans 'tarif identifier for this reservation' %}</li> |
|
235 |
<li><em>majored</em> {% trans 'boolean specifying if the tarif is majored' %}</li> |
|
236 |
</ul> |
|
237 |
</li> |
|
238 |
<li> |
|
239 |
{% url 'agoraplus-periscol-enrollment-reservations' slug=object.slug enrollment_id='enrollment_id' as periscol_enrollment_reservations_url %} |
|
240 |
{% trans 'Get enrollment reservations:' %} <a href="{{ periscol_enrollment_reservations_url }}">{{ site_base_uri }}{{ periscol_enrollment_reservations_url }}</a> |
|
241 |
</li> |
|
242 |
<li> |
|
243 |
{% url 'agoraplus-periscol-reservation-delete' slug=object.slug reservation_id=4242 as periscol_enrollment_reservation_delete_url %} |
|
244 |
{% trans 'Delete enrollment reservation:' %} <a href="{{ periscol_enrollment_reservation_delete_url }}">{{ site_base_uri }}{{ periscol_enrollment_reservation_delete_url }}</a> |
|
245 |
</li> |
|
246 |
</ul> |
|
206 | 247 |
{% endblock %} |
207 | 248 | |
208 | 249 |
{% block security %} |
passerelle/contrib/agoraplus/urls.py | ||
---|---|---|
114 | 114 |
url(r'^(?P<slug>[\w-]+)/regie/invoice/(?P<invoice_id>[\w,-]+)/$', InvoiceView.as_view(), name='agoraplus-invoice'), |
115 | 115 |
url(r'^(?P<slug>[\w-]+)/regie/invoice/(?P<invoice_id>[\w,-]+)/pdf/$', InvoicePDFView.as_view(), name='agoraplus-invoice-pdf'), |
116 | 116 |
url(r'^(?P<slug>[\w-]+)/document/?$', DocumentView.as_view(), name='agoraplus-document'), |
117 |
url(r'^(?P<slug>[\w-]+)/periscol/enrollments/(?P<child_id>[\w-]+)/(?P<service_id>[\w-]*)/?$', |
|
118 |
PeriscolChildEnrollmentsView.as_view(), |
|
119 |
name='agoraplus-child-periscol-enrollments'), |
|
120 |
url(r'^(?P<slug>[\w-]+)/periscol/enrollment/(?P<enrollment_id>[\w-]+)/planning/$', |
|
121 |
PeriscolEnrollmentPlanningView.as_view(), |
|
122 |
name='agoraplus-enrollment-planning'), |
|
123 |
url(r'^(?P<slug>[\w-]+)/periscol/child/(?P<child_id>[\w-]+)/enrollment/(?P<enrollment_id>[\w-]+)/planning/(?P<which>[\w-]+)/$', |
|
124 |
PeriscolChildEnrollmentPlanningView.as_view(), |
|
125 |
name='agoraplus-periscol-child-enrollment-planning'), |
|
126 |
url(r'^(?P<slug>[\w-]+)/periscol/reservation/add/$', |
|
127 |
PeriscolAddReservationView.as_view(), |
|
128 |
name='agoraplus-periscol-add-reservation'), |
|
129 |
url(r'^(?P<slug>[\w-]+)/periscol/reservations/(?P<enrollment_id>[\w-]+)/$', |
|
130 |
PeriscolEnrollmentReservationsView.as_view(), |
|
131 |
name='agoraplus-periscol-enrollment-reservations'), |
|
132 |
url(r'^(?P<slug>[\w-]+)/periscol/reservation/(?P<reservation_id>\d+)/delete/$', |
|
133 |
PeriscolDeleteReservationView.as_view(), |
|
134 |
name='agoraplus-periscol-reservation-delete') |
|
117 | 135 |
) |
passerelle/contrib/agoraplus/views.py | ||
---|---|---|
506 | 506 |
return self.object.get_nursery_enrollment_result(enroll_id) |
507 | 507 | |
508 | 508 | |
509 |
class PeriscolChildEnrollmentsView(DetailView): |
|
510 |
def get_data(self, request, child_id, service_id, *args, **kwargs): |
|
511 |
return self.object.get_periscol_enrollments(child_id, service_id, |
|
512 |
request.GET.get('NameID'), request.GET.get('date')) |
|
513 | ||
514 |
class PeriscolEnrollmentPlanningView(DetailView): |
|
515 |
def get_data(self, request, enrollment_id, *args, **kwargs): |
|
516 |
return self.object.get_periscol_enrollment_planning(enrollment_id) |
|
517 | ||
518 | ||
519 |
class PeriscolChildEnrollmentPlanningView(DetailView): |
|
520 |
def get_data(self, request, child_id, enrollment_id, which, *args, **kwargs): |
|
521 |
return self.object.get_periscol_child_enrollment_planning(child_id, enrollment_id, which, request.GET.get('NameID')) |
|
522 | ||
523 | ||
524 |
class PeriscolAddReservationView(DetailView): |
|
525 |
@method_decorator(csrf_exempt) |
|
526 |
def dispatch(self, *args, **kwargs): |
|
527 |
return super(PeriscolAddReservationView, self).dispatch(*args, **kwargs) |
|
528 | ||
529 |
@utils.protected_api('can_access') |
|
530 |
def post(self, request, *args, **kwargs): |
|
531 |
self.object = self.get_object() |
|
532 |
try: |
|
533 |
data = json.loads(request.body) |
|
534 |
enrollment_id = int(data['enrollment_id']) |
|
535 |
date = data['date'] |
|
536 |
tarif_id = int(data['tarif_id']) |
|
537 |
majored = data['majored'] |
|
538 |
except (ValueError, TypeError, KeyError) as e: |
|
539 |
return HttpResponseBadRequest() |
|
540 |
return self.object.create_periscol_reservation(enrollment_id, date, tarif_id, majored) |
|
541 | ||
542 | ||
543 |
class PeriscolEnrollmentReservationsView(DetailView): |
|
544 |
def get_data(self, request, enrollment_id, *args, **kwargs): |
|
545 |
return self.object.get_periscol_enrollment_reservations(enrollment_id) |
|
546 | ||
547 | ||
548 |
class PeriscolDeleteReservationView(DetailView): |
|
549 |
def get_data(self, request, reservation_id, *args, **kwargs): |
|
550 |
return self.object.delete_periscol_enrollment_reservation(reservation_id) |
|
551 | ||
552 | ||
509 | 553 |
class InvoicesView(DetailView): |
510 | 554 |
def get_data(self, request, **kwargs): |
511 | 555 |
if not self.login: # unlinked account: no invoice |
512 |
- |