|
1 |
import datetime
|
1 |
2 |
import json
|
2 |
3 |
import os
|
|
4 |
import time
|
3 |
5 |
|
4 |
6 |
import pytest
|
|
7 |
from django.utils.timezone import make_aware
|
5 |
8 |
from webtest import Upload
|
6 |
9 |
|
7 |
10 |
from wcs import fields
|
8 |
11 |
from wcs.api_access import ApiAccess
|
9 |
12 |
from wcs.carddef import CardDef
|
|
13 |
from wcs.formdata import Evolution
|
10 |
14 |
from wcs.formdef import FormDef
|
11 |
15 |
from wcs.qommon.http_request import HTTPRequest
|
12 |
16 |
from wcs.qommon.ident.password_accounts import PasswordAccount
|
... | ... | |
739 |
743 |
assert carddata.evolution[0].parts[0].formdef_id == str(carddef.id)
|
740 |
744 |
assert carddata.evolution[0].parts[0].old_data == {}
|
741 |
745 |
assert carddata.evolution[0].parts[0].new_data == {'1': 'xxx'}
|
|
746 |
|
|
747 |
|
|
748 |
def test_api_formdata_at(pub, user, access, role):
|
|
749 |
app = get_app(pub)
|
|
750 |
app.set_authorization(('Basic', ('test', '12345')))
|
|
751 |
|
|
752 |
FormDef.wipe()
|
|
753 |
formdef = FormDef()
|
|
754 |
formdef.name = 'test'
|
|
755 |
formdef.fields = [
|
|
756 |
fields.StringField(id='0', label='foobar', varname='foobar'),
|
|
757 |
]
|
|
758 |
workflow = Workflow(name='foo')
|
|
759 |
workflow.possible_status = Workflow.get_default_workflow().possible_status[:]
|
|
760 |
workflow.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(workflow)
|
|
761 |
workflow.backoffice_fields_formdef.fields = [
|
|
762 |
fields.StringField(id='bo1', label='bo field 1', type='string', varname='plop'),
|
|
763 |
]
|
|
764 |
workflow.store()
|
|
765 |
formdef.workflow_id = workflow.id
|
|
766 |
formdef.workflow_roles = {'_receiver': role.id}
|
|
767 |
formdef.store()
|
|
768 |
|
|
769 |
formdef.data_class().wipe()
|
|
770 |
formdata = formdef.data_class()()
|
|
771 |
formdata.data = {
|
|
772 |
'0': 'foo',
|
|
773 |
'bo1': 'bar',
|
|
774 |
}
|
|
775 |
formdata.just_created()
|
|
776 |
formdata.evolution[-1].parts[0].datetime = make_aware(datetime.datetime(2022, 1, 2, 3, 4))
|
|
777 |
formdata.store()
|
|
778 |
|
|
779 |
def get_evo_and_parts(formdata):
|
|
780 |
for evo in formdata.evolution:
|
|
781 |
for part in evo.parts or []:
|
|
782 |
if isinstance(part, ContentSnapshotPart):
|
|
783 |
yield part.datetime.strftime('%Y-%m-%d %H:%M'), part.old_data, part.new_data
|
|
784 |
|
|
785 |
assert list(get_evo_and_parts(formdata)) == [('2022-01-02 03:04', {}, {'0': 'foo', 'bo1': 'bar'})]
|
|
786 |
resp = app.get('/api/forms/test/%s/' % formdata.id)
|
|
787 |
assert resp.json['fields'] == {'foobar': 'foo'}
|
|
788 |
assert resp.json['workflow']['fields'] == {'plop': 'bar'}
|
|
789 |
resp = app.get('/api/forms/test/list/?full=on')
|
|
790 |
assert len(resp.json) == 1
|
|
791 |
assert resp.json[0]['fields'] == {'foobar': 'foo'}
|
|
792 |
assert resp.json[0]['workflow']['fields'] == {'plop': 'bar'}
|
|
793 |
|
|
794 |
# wrong format
|
|
795 |
resp = app.get('/api/forms/test/%s/?at=bad-format' % formdata.id, status=400)
|
|
796 |
assert resp.json['err_desc'] == 'Invalid value "bad-format" for "at"'
|
|
797 |
resp = app.get('/api/forms/test/list/?full=on&at=bad-format', status=400)
|
|
798 |
assert resp.json['err_desc'] == 'Invalid value "bad-format" for "at"'
|
|
799 |
|
|
800 |
# before formdata creation
|
|
801 |
resp = app.get(
|
|
802 |
'/api/forms/test/%s/' % formdata.id, params={'at': '2022-01-02T00:00:00+01:00'}, status=400
|
|
803 |
)
|
|
804 |
assert resp.json['err_desc'] == 'No data found for this datetime'
|
|
805 |
resp = app.get('/api/forms/test/list/', params={'full': 'on', 'at': '2022-01-02T00:00:00+01:00'})
|
|
806 |
assert len(resp.json) == 0
|
|
807 |
resp = app.get(
|
|
808 |
'/api/forms/test/%s/' % formdata.id, params={'at': '2022-01-02T03:04:00+01:00'}, status=400
|
|
809 |
)
|
|
810 |
assert resp.json['err_desc'] == 'No data found for this datetime'
|
|
811 |
resp = app.get('/api/forms/test/list/', params={'full': 'on', 'at': '2022-01-02T03:04:00+01:00'})
|
|
812 |
assert len(resp.json) == 0
|
|
813 |
|
|
814 |
# no ContentSnapshotPart (legacy formdata)
|
|
815 |
formdata.evolution[0].parts = []
|
|
816 |
formdata.store()
|
|
817 |
assert list(get_evo_and_parts(formdata)) == []
|
|
818 |
|
|
819 |
# add evolutions with ContentSnapshotPart
|
|
820 |
evo = formdata.evolution[0]
|
|
821 |
part = ContentSnapshotPart(formdata=formdata, old_data={})
|
|
822 |
part.new_data = {'0': 'bar', 'bo1': 'foo'}
|
|
823 |
part.datetime = make_aware(datetime.datetime(2022, 1, 2, 3, 4))
|
|
824 |
evo.add_part(part)
|
|
825 |
|
|
826 |
evo = Evolution()
|
|
827 |
evo.time = time.localtime()
|
|
828 |
evo.status = formdata.status
|
|
829 |
part = ContentSnapshotPart(formdata=formdata, old_data={'0': 'bar', 'bo1': 'foo'})
|
|
830 |
part.new_data = {'0': 'baz', 'bo1': 'foo'}
|
|
831 |
part.datetime = make_aware(datetime.datetime(2022, 1, 2, 3, 5))
|
|
832 |
evo.add_part(part)
|
|
833 |
formdata.evolution.append(evo)
|
|
834 |
|
|
835 |
evo = Evolution()
|
|
836 |
evo.time = time.localtime()
|
|
837 |
evo.status = formdata.status
|
|
838 |
part = ContentSnapshotPart(formdata=formdata, old_data={'0': 'baz', 'bo1': 'foo'})
|
|
839 |
part.new_data = {'0': 'foooo', '1': 'unknown', 'bo1': 'foo'}
|
|
840 |
part.datetime = make_aware(datetime.datetime(2022, 1, 4, 5, 6))
|
|
841 |
evo.add_part(part)
|
|
842 |
formdata.evolution.append(evo)
|
|
843 |
|
|
844 |
evo = Evolution()
|
|
845 |
evo.time = time.localtime()
|
|
846 |
evo.status = formdata.status
|
|
847 |
part = ContentSnapshotPart(formdata=formdata, old_data={'0': 'foooo', '1': 'unknown', 'bo1': 'foo'})
|
|
848 |
part.new_data = {'0': 'fooo', 'bo1': 'foo'}
|
|
849 |
part.datetime = make_aware(datetime.datetime(2022, 1, 5, 6, 7))
|
|
850 |
evo.add_part(part)
|
|
851 |
part = ContentSnapshotPart(formdata=formdata, old_data={'0': 'fooo', 'bo1': 'foo'})
|
|
852 |
part.new_data = {'0': 'foo', 'bo1': 'bar'}
|
|
853 |
part.datetime = make_aware(datetime.datetime(2022, 1, 5, 6, 7))
|
|
854 |
evo.add_part(part)
|
|
855 |
formdata.evolution.append(evo)
|
|
856 |
|
|
857 |
formdata._store_all_evolution = True
|
|
858 |
formdata.store()
|
|
859 |
assert list(get_evo_and_parts(formdata)) == [
|
|
860 |
('2022-01-02 03:04', {}, {'0': 'bar', 'bo1': 'foo'}),
|
|
861 |
('2022-01-02 03:05', {'0': 'bar', 'bo1': 'foo'}, {'0': 'baz', 'bo1': 'foo'}),
|
|
862 |
('2022-01-04 05:06', {'0': 'baz', 'bo1': 'foo'}, {'0': 'foooo', '1': 'unknown', 'bo1': 'foo'}),
|
|
863 |
('2022-01-05 06:07', {'0': 'foooo', '1': 'unknown', 'bo1': 'foo'}, {'0': 'fooo', 'bo1': 'foo'}),
|
|
864 |
('2022-01-05 06:07', {'0': 'fooo', 'bo1': 'foo'}, {'0': 'foo', 'bo1': 'bar'}),
|
|
865 |
]
|
|
866 |
|
|
867 |
resp = app.get('/api/forms/test/%s/' % formdata.id, params={'at': '2022-01-03T00:00:00+01:00'})
|
|
868 |
assert resp.json['fields'] == {'foobar': 'baz'}
|
|
869 |
assert resp.json['workflow']['fields'] == {'plop': 'foo'}
|
|
870 |
resp = app.get('/api/forms/test/list/', params={'full': 'on', 'at': '2022-01-03T00:00:00+01:00'})
|
|
871 |
assert len(resp.json) == 1
|
|
872 |
assert resp.json[0]['fields'] == {'foobar': 'baz'}
|
|
873 |
assert resp.json[0]['workflow']['fields'] == {'plop': 'foo'}
|
|
874 |
|
|
875 |
resp = app.get('/api/forms/test/%s/' % formdata.id, params={'at': '2022-01-02T03:05:00+01:00'})
|
|
876 |
assert resp.json['fields'] == {'foobar': 'bar'}
|
|
877 |
assert resp.json['workflow']['fields'] == {'plop': 'foo'}
|
|
878 |
resp = app.get('/api/forms/test/list/', params={'full': 'on', 'at': '2022-01-02T03:05:00+01:00'})
|
|
879 |
assert len(resp.json) == 1
|
|
880 |
assert resp.json[0]['fields'] == {'foobar': 'bar'}
|
|
881 |
assert resp.json[0]['workflow']['fields'] == {'plop': 'foo'}
|
|
882 |
|
|
883 |
resp = app.get('/api/forms/test/%s/' % formdata.id, params={'at': '2022-01-02T03:06:00+01:00'})
|
|
884 |
assert resp.json['fields'] == {'foobar': 'baz'}
|
|
885 |
assert resp.json['workflow']['fields'] == {'plop': 'foo'}
|
|
886 |
resp = app.get('/api/forms/test/list/', params={'full': 'on', 'at': '2022-01-02T03:06:00+01:00'})
|
|
887 |
assert len(resp.json) == 1
|
|
888 |
assert resp.json[0]['fields'] == {'foobar': 'baz'}
|
|
889 |
assert resp.json[0]['workflow']['fields'] == {'plop': 'foo'}
|
|
890 |
|
|
891 |
resp = app.get('/api/forms/test/%s/' % formdata.id, params={'at': '2022-01-04T00:00:00+01:00'})
|
|
892 |
assert resp.json['fields'] == {'foobar': 'baz'}
|
|
893 |
assert resp.json['workflow']['fields'] == {'plop': 'foo'}
|
|
894 |
resp = app.get('/api/forms/test/list/', params={'full': 'on', 'at': '2022-01-04T00:00:00+01:00'})
|
|
895 |
assert len(resp.json) == 1
|
|
896 |
assert resp.json[0]['fields'] == {'foobar': 'baz'}
|
|
897 |
assert resp.json[0]['workflow']['fields'] == {'plop': 'foo'}
|
|
898 |
|
|
899 |
resp = app.get('/api/forms/test/%s/' % formdata.id, params={'at': '2022-01-05T00:00:00+01:00'})
|
|
900 |
assert resp.json['fields'] == {'foobar': 'foooo'}
|
|
901 |
assert resp.json['workflow']['fields'] == {'plop': 'foo'}
|
|
902 |
resp = app.get('/api/forms/test/list/', params={'full': 'on', 'at': '2022-01-05T00:00:00+01:00'})
|
|
903 |
assert len(resp.json) == 1
|
|
904 |
assert resp.json[0]['fields'] == {'foobar': 'foooo'}
|
|
905 |
assert resp.json[0]['workflow']['fields'] == {'plop': 'foo'}
|
|
906 |
|
|
907 |
resp = app.get('/api/forms/test/%s/' % formdata.id, params={'at': '2022-01-05T06:07:00+01:00'})
|
|
908 |
assert resp.json['fields'] == {'foobar': 'foooo'}
|
|
909 |
assert resp.json['workflow']['fields'] == {'plop': 'foo'}
|
|
910 |
resp = app.get('/api/forms/test/list/', params={'full': 'on', 'at': '2022-01-05T06:07:00+01:00'})
|
|
911 |
assert len(resp.json) == 1
|
|
912 |
assert resp.json[0]['fields'] == {'foobar': 'foooo'}
|
|
913 |
assert resp.json[0]['workflow']['fields'] == {'plop': 'foo'}
|
|
914 |
|
|
915 |
resp = app.get('/api/forms/test/%s/' % formdata.id, params={'at': '2022-01-05T06:08:00+01:00'})
|
|
916 |
assert resp.json['fields'] == {'foobar': 'foo'}
|
|
917 |
assert resp.json['workflow']['fields'] == {'plop': 'bar'}
|
|
918 |
resp = app.get('/api/forms/test/list/', params={'full': 'on', 'at': '2022-01-05T06:08:00+01:00'})
|
|
919 |
assert len(resp.json) == 1
|
|
920 |
assert resp.json[0]['fields'] == {'foobar': 'foo'}
|
|
921 |
assert resp.json[0]['workflow']['fields'] == {'plop': 'bar'}
|
|
922 |
|
|
923 |
resp = app.get('/api/forms/test/%s/' % formdata.id, params={'at': '2022-01-06T00:00:00+01:00'})
|
|
924 |
assert resp.json['fields'] == {'foobar': 'foo'}
|
|
925 |
assert resp.json['workflow']['fields'] == {'plop': 'bar'}
|
|
926 |
resp = app.get('/api/forms/test/list/', params={'full': 'on', 'at': '2022-01-06T00:00:00+01:00'})
|
|
927 |
assert len(resp.json) == 1
|
|
928 |
assert resp.json[0]['fields'] == {'foobar': 'foo'}
|
|
929 |
assert resp.json[0]['workflow']['fields'] == {'plop': 'bar'}
|
|
930 |
|
|
931 |
resp = app.get('/api/forms/test/%s/' % formdata.id, params={'at': '2022-01-07T00:00:00+01:00'})
|
|
932 |
assert resp.json['fields'] == {'foobar': 'foo'}
|
|
933 |
assert resp.json['workflow']['fields'] == {'plop': 'bar'}
|
|
934 |
resp = app.get('/api/forms/test/list/', params={'full': 'on', 'at': '2022-01-07T00:00:00+01:00'})
|
|
935 |
assert len(resp.json) == 1
|
|
936 |
assert resp.json[0]['fields'] == {'foobar': 'foo'}
|
|
937 |
assert resp.json[0]['workflow']['fields'] == {'plop': 'bar'}
|
|
938 |
|
|
939 |
# check with other TZ
|
|
940 |
resp = app.get(
|
|
941 |
'/api/forms/test/%s/' % formdata.id, params={'at': '2022-01-02T04:04:00+02:00'}, status=400
|
|
942 |
)
|
|
943 |
assert resp.json['err_desc'] == 'No data found for this datetime'
|
|
944 |
resp = app.get('/api/forms/test/list/', params={'full': 'on', 'at': '2022-01-02T04:04:00+02:00'})
|
|
945 |
assert len(resp.json) == 0
|
|
946 |
resp = app.get('/api/forms/test/%s/' % formdata.id, params={'at': '2022-01-02T04:05:00+02:00'})
|
|
947 |
assert resp.json['fields'] == {'foobar': 'bar'}
|
|
948 |
assert resp.json['workflow']['fields'] == {'plop': 'foo'}
|
|
949 |
resp = app.get('/api/forms/test/list/', params={'full': 'on', 'at': '2022-01-02T04:05:00+02:00'})
|
|
950 |
assert len(resp.json) == 1
|
|
951 |
assert resp.json[0]['fields'] == {'foobar': 'bar'}
|
|
952 |
assert resp.json[0]['workflow']['fields'] == {'plop': 'foo'}
|
|
953 |
|
|
954 |
# check without TZ
|
|
955 |
resp = app.get('/api/forms/test/%s/' % formdata.id, params={'at': '2022-01-02T03:04:00'}, status=400)
|
|
956 |
assert resp.json['err_desc'] == 'No data found for this datetime'
|
|
957 |
resp = app.get('/api/forms/test/list/', params={'full': 'on', 'at': '2022-01-02T03:04:00'})
|
|
958 |
assert len(resp.json) == 0
|
|
959 |
resp = app.get('/api/forms/test/%s/' % formdata.id, params={'at': '2022-01-02T03:05:00'})
|
|
960 |
assert resp.json['fields'] == {'foobar': 'bar'}
|
|
961 |
assert resp.json['workflow']['fields'] == {'plop': 'foo'}
|
|
962 |
resp = app.get('/api/forms/test/list/', params={'full': 'on', 'at': '2022-01-02T03:05:00'})
|
|
963 |
assert len(resp.json) == 1
|
|
964 |
assert resp.json[0]['fields'] == {'foobar': 'bar'}
|
|
965 |
assert resp.json[0]['workflow']['fields'] == {'plop': 'foo'}
|