Projet

Général

Profil

0001-agoraplus-add-periscol-inscriptions-endpoints-17429.patch

Serghei Mihai, 11 juillet 2017 00:53

Télécharger (13,7 ko)

Voir les différences:

Subject: [PATCH] agoraplus: add periscol inscriptions endpoints (#17429)

 passerelle/contrib/agoraplus/models.py             | 73 +++++++++++++++++++++-
 passerelle/contrib/agoraplus/normalize.py          | 10 +++
 .../passerelle/contrib/agoraplus/detail.html       | 41 ++++++++++++
 passerelle/contrib/agoraplus/urls.py               | 18 ++++++
 passerelle/contrib/agoraplus/views.py              | 44 +++++++++++++
 5 files changed, 185 insertions(+), 1 deletion(-)
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.is_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 += '&%s' % urlencode({'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.is_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 += '&%s' % urlencode({'start_date': start_date})
847
            url += '&%s' % urlencode({'end_date': end_date})
848
        with wrap_agora_periscol(self.request(url),
849
                        'to get periscol child enrollment planning') as planning:
850
            return [normalize_periscol_enrollment_planning(p) for p in planning['PLANNING_DAYS']]
851

  
852
    def create_periscol_reservation(enrollment_id, date, tarif_id, majored):
853
        url = 'reservations_periscol/'
854
        data = {'ID_INSCRIPTION': enrollment_id,
855
                'DAY': date,
856
                'ID_DEF_TARIF': tarif_id,
857
                'MAJORED': majored}
858
        with wrap_agora_periscol(self.request(url, json=data), 'to add reservation') as reservation_add_result:
859
            return reservation_add_result
860

  
861
    def get_periscol_enrollment_reservations(self, enrollment_id):
862
        url = 'reservations_periscol/%s/reservations/' % enrollment_id
863
        with wrap_agora_periscol(self.request(url),
864
                        'to get periscol enrollment reservations') as reservations:
865
            return [{'id': u'%s' % r['ID'], 'text': r['DAY']} for r in reservations['RESERVATION_LIST']]
866

  
867
    def delete_periscol_enrollment_reservation(self, reservation_id):
868
        url = 'reservations_periscol/'
869
        data = {"ID": int(reservation_id)}
870
        with wrap_agora_periscol(self.request(url, method='delete'),
871
                                 'to delete periscol reservation') as result:
872
            return result
873

  
810 874
    def get_invoices(self, login):
811 875
        if not login: # unlinked account
812 876
            return []
......
878 942
                return adult['original_id']
879 943
        raise ObjectDoesNotExist(_('adult not in Agora+'))
880 944

  
945
    def is_child_in_name_id_family(child_id, name_id):
946
        family = self.get_family(name_id=name_id)
947
        for child in family['children']:
948
            if child_id == child['id']:
949
                return True
950
        return False
951

  
881 952
    def update_phone_numbers(self, login, name_id, adult_id,
882 953
                             new_phone_number, new_cellphone_number):
883 954
        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' reserved_day='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<reserved_day>[\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
-