a #e@sddlZddlmZddlmZddlmZddlmZddlm Z ddl m Z ddl m Z dd l mZdd lmZmZdd lmZmZdd lmZdd lmZddlmZedZGdddejZe ejeddddZ GdddeZ!Gddde Z"dS)N)settings)models)Q)signals)receiver)timezone)GroupObjectPermissionBase)UserObjectPermissionBase)get_perms_for_model assign_perm) gettext_lazygettext) transaction)pending_actions) status_codesz app.loggercseZdZejejejededdZ ej dededdZ ej dd ed ed d Z ejejed eddZejd dededdZej d dd ededdZfddZddZddZddZdd Zd&d"d#ZGd$d%d%ZZS)'Projectz"The person who created the projectZOwner) on_delete help_text verbose_namez$A label used to describe the projectName) max_lengthrrTz(More in-depth description of the projectZ Description)defaultblankrrz Creation datez Created at)rrrFzWhether this project has been marked for deletion. Projects that have running tasks need to wait for tasks to be properly cleaned up before they can be deleted.ZDeleting)db_indexrrrz Project tagsTags)rrrrrcsb|jdkr.td|jtj|n0|jjt j dd|_ | td|jdS)NrzDeleted project {})Zpending_actionTz+Tasks pending, set project {} deleting flag) task_setcountloggerinfoformatidsuperdeleteupdaterZREMOVEdeletingsave)selfargs __class__/webodm/app/models/project.pyr$szProject.deletecCs|jSN)namer(r,r,r-__str__-szProject.__str__cCs |jdS)Nr")ronlyr0r,r,r-tasks0sz Project.taskscCs |jSr.)rrr0r,r,r- tasks_count3szProject.tasks_countcCsBdd|jjtjdtddtddBtddBdd DS) NcSsg|] }|qSr,) get_map_items).0taskr,r,r- 7z)Project.get_map_items..)statusF)Zorthophoto_extent__isnull)Zdsm_extent__isnull)Zdtm_extent__isnullr"Z project_id)rfilterrZ COMPLETEDrr2r0r,r,r-r56s zProject.get_map_itemsNc Cszttjj|jd}d|_tdd|ji|_t |_ |durN||_ | | |jD]0}|jdd}|std|||_| qhWdn1s0Y|WSty}z tdt|WYd}~n d}~00dS)N)pkzCopy of %(task)sr7F)Z set_new_namezFailed to duplicate {}zCannot duplicate project: {})ratomicrobjectsgetr<r r/rnow created_atownerr'refresh_from_dbrall duplicate Exceptionr!projectrwarningstr)r(Z new_ownerrGr7Znew_tasker,r,r-rE<s(   (*zProject.duplicatec@seZdZedZedZdS)z Project.MetarZProjectsN)__name__ __module__ __qualname___rverbose_name_pluralr,r,r,r-MetaYsrP)N)rKrLrMr ForeignKeyrAUTH_USER_MODELPROTECTrNrB CharFieldr/ TextField description DateTimeFieldrr@rA BooleanFieldr&tagsr$r1r3r4r5rErP __classcell__r,r,r*r-rs  rproject_post_save)sender dispatch_uidcKs&t|D]}t|j|j|q dS)z Automatically assigns all permissions to the owner. If the owner changes it's up to the user/developer to remove the previous owner's permissions. N)r rDr codenamerB)r\instancecreatedkwargspermr,r,r-r[]sc@seZdZejeejdZdS)ProjectUserObjectPermissionrNrKrLrMrrQrCASCADEcontent_objectr,r,r,r-rcgsrcc@seZdZejeejdZdS)ProjectGroupObjectPermissionrdNrer,r,r,r-rhksrh)#logging django.confr django.dbrdjango.db.modelsrrdjango.dispatchr django.utilsrguardian.modelsrr Zguardian.shortcutsr r django.utils.translationr rNr rapprnodeodmr getLoggerrModelr post_saver[rcrhr,r,r,r-s&            G