a #e#@s"ddlZddlmZmZmZmZddlmZmZddl m Z ddl m Z ddlm Z ddlmZddlmZdd lmZdd lmZmZdd lmZdd lmZdd lmZddlmZddlm Z m!Z!ddl"m#Z#ddl$m%Z&ddZ'Gdddej(Z)Gdddej*Z+Gdddej,Z-dS)N) get_permsget_users_with_perms assign_perm remove_perm) serializersviewsets)action)Responsestatus)rest_framework) transaction)User) SearchQuery SearchVector) StringAgg)Q)models)TaskIDsSerializer) TagsFieldparse_tags_input)get_and_check_project)gettextcCsttdd|S)NcSs |ddS)N_projectreplace)pr/webodm/app/api/projects.pyz'normalized_perm_names..)listmap)permsrrr normalized_perm_namessr&c@sheZdZedddZejedZe Z e Z e Z eddZddZdd ZGd d d Zd S) ProjectSerializerT)many read_only)defaultF)requiredcCs(d|jvr tt|jdj|SgSdS)Nrequest)contextr&ruser)selfobjrrr get_permissions!s z!ProjectSerializer.get_permissionscCs.d|jvr*|jdj}|jp(|jj|jkSdS)Nr,F)r-r. is_superuserownerid)r/r0r.rrr get_owned(s  zProjectSerializer.get_ownedc@seZdZejZdZdS)zProjectSerializer.MetadeletingN)__name__ __module__ __qualname__rProjectmodelexcluderrrr Meta.sr>N)r8r9r:rtasksr HiddenFieldCurrentUserDefaultr3SerializerMethodFieldowned ReadOnlyField created_at permissionsrtagsr1r5r>rrrr r's  r'c@s.eZdZejddZddZGdddZdS) ProjectFilter filter_search)methodc Csr|dd}td}tt||}tdd|D}||}dd|D}dd|D}tdd t|d |}t|d krtd } tt d d d} t |dd} |j | | dj | d}t|d krtd} t |d } |ddD]}| t |@} q|j | dj | d}t|d krjtd}t |d } |ddD]}| t |@} qB|j |dj | d}| S)N:#z#[^\s]+cSsg|]}|dr|qS)##) startswith.0trrr ;r"z/ProjectFilter.filter_search..cSsg|]}|ddqS)rMrrrOrrr rR>r"cSsg|]}|ddqS)rLrrrOrrr rR?r"z\s+ rrnameZ task__name) delimiterplain) search_type)Zn_searchZ task__tagsr)Z tt_searchrG)Z pt_search)rrecompilesetfindallsubstriplenrrrannotatefilterdistinct)r/qsrTvalueZ tag_patternrGZ task_tagsZ project_tagsnamesZproject_name_vecZ task_name_vecZ name_queryZ task_tags_vecZ tags_queryrQZproject_tags_vecrrr rI6s4      zProjectFilter.filter_searchc@seZdZejZgdZdS)zProjectFilter.Meta)searchr4rT descriptionrEN)r8r9r:rr;r<fieldsrrrr r>Ysr>N)r8r9r:filters CharFilterrerIr>rrrr rH3s #rHcseZdZdZdZeZejj dj dd dZ eZdZfdd Zed d gd dddZed dgd dddZed d gd dddZdfdd ZZS)ProjectViewSeta& Project get/add/delete/update Projects are the building blocks of processing. Each project can have zero or more tasks associated with it. Users can fine tune the permissions on projects, including whether users/groups have access to view, add, change or delete them. )r4rTrfrEtask_setFr6z -created_at__all__cs.|jr"|jj|jjddur"dSt|S)N) paginatorr, query_paramsgetpage_query_paramsuperpaginate_queryset)r/queryset __class__rr rrmsz ProjectViewSet.paginate_querysetTpost)detailmethodsNcCsRt||d}|j|jd}|r8tdt|jdtjdStdtditjdSdS) z" Duplicate a task change_project) new_ownerT)successprojectr errorzCannot duplicate projectN) r duplicater.r r'datar HTTP_200_OK_)r/r,pkr}Z new_projectrrr rrs  zProjectViewSet.duplicaterocCsjt||d}g}t|ddd}|D]&}||j|j|kt||dq"|jddddt|tj d S) NryTF attach_permswith_group_users)usernamer3rFcSs|dS)Nr3r)rrrr r!r"z,ProjectViewSet.permissions..)keyreverser ) rrappendrr3r&sortr r r)r/r,rr}resultr%r.rrr rFs  zProjectViewSet.permissionsc Cs2t||d}ztx|jdd|_|jdd|_tt |jdg|_ | |jd}|duri}|D](}|ds~|dr~|d||d<q~t |d d d }|D]:}|j |krq||jdur||D]} t| ||qq|D]} d D]~} | d }tjj| d}|j |kr,q|||rV| || vrVt|||n(| || vr|||st|||qqWdn1s0YWnxtjy} z"tdtditjdWYd} ~ Sd} ~ 0ty} z"tdtditjdWYd} ~ Sd} ~ 00tdd itjdS)NryrTrrfrGrFr3rTFraddchangedeleteviewr)rr~z Invalid user in permissions listr zInvalid permissionsr|)rr atomicrrorTrfrto_internal_valuerrGsaverr3rrrobjectshas_permr DoesNotExistr rr HTTP_400_BAD_REQUESTAttributeErrorr) r/r,rr}Z form_perms perms_mappermZdb_permsr.rrerrr editsF       6*,zProjectViewSet.editcsnt||d}|j|jks |jjr>t||dtj|||dSdD]}|d}t||j|qBttj dSdS)N) view_project)delete_project)rrrr ) rr3r.r2rqdestroyrr r HTTP_204_NO_CONTENT)r/r,rr}rrrtrr rs  zProjectViewSet.destroy)N)N)N)N)r8r9r:__doc__ filter_fieldsr'serializer_classrr;rprefetch_relatedr`order_byrsrHfilterset_classordering_fieldsrrrrrFrr __classcell__rrrtr rj^s      8rj).rXguardian.shortcutsrrrrr rrrest_framework.decoratorsrrest_framework.responser r django_filtersrh django.dbr django.contrib.auth.modelsrZdjango.contrib.postgres.searchrrZ"django.contrib.postgres.aggregatesrdjango.db.modelsrapprr?rrGrrcommonrdjango.utils.translationrrr&ModelSerializerr' FilterSetrH ModelViewSetrjrrrr s(            +