From 81b8a602970e6e8bfb654b96b7ff7bae7cd4e4f9 Mon Sep 17 00:00:00 2001 From: Niloth P <20315308+Niloth-p@users.noreply.github.com> Date: Mon, 11 Nov 2024 18:38:43 +0530 Subject: [PATCH] webhooks: Update Clubhouse integration to Shortcut. Fixes #22731. --- .../integrations/bot_avatars/clubhouse.png | Bin 2956 -> 0 bytes .../integrations/bot_avatars/shortcut.png | Bin 0 -> 4298 bytes .../integrations/bot_avatars/shortcut.svg | Bin 0 -> 1781 bytes static/images/integrations/clubhouse/001.png | Bin 35485 -> 0 bytes .../images/integrations/logos/clubhouse.svg | Bin 620 -> 0 bytes static/images/integrations/logos/shortcut.svg | Bin 0 -> 1442 bytes static/images/integrations/shortcut/001.png | Bin 0 -> 40122 bytes zerver/lib/integrations.py | 4 +- .../{clubhouse => shortcut}/__init__.py | 0 .../webhooks/{clubhouse => shortcut}/doc.md | 8 +- .../fixtures/epic_archive.json | 0 .../fixtures/epic_create.json | 0 .../fixtures/epic_create_story.json | 4 +- .../fixtures/epic_delete.json | 2 +- .../fixtures/epic_update_add_comment.json | 0 .../fixtures/epic_update_add_description.json | 0 .../epic_update_change_description.json | 0 .../fixtures/epic_update_change_state.json | 0 .../fixtures/epic_update_change_title.json | 0 .../epic_update_remove_description.json | 0 .../fixtures/story_archive.json | 2 +- .../fixtures/story_comment_updated.json | 2 +- .../fixtures/story_create.json | 2 +- .../fixtures/story_delete.json | 0 .../fixtures/story_task_complete.json | 2 +- .../fixtures/story_task_create.json | 2 +- .../fixtures/story_task_delete.json | 2 +- .../fixtures/story_task_not_complete.json | 2 +- .../fixtures/story_unarchive.json | 2 +- .../fixtures/story_update_add_attachment.json | 2 +- .../fixtures/story_update_add_comment.json | 2 +- .../story_update_add_description.json | 2 +- .../fixtures/story_update_add_epic.json | 2 +- .../fixtures/story_update_add_estimate.json | 2 +- .../story_update_add_github_branch.json | 2 +- ...ate_add_github_multiple_pull_requests.json | 4 +- ...b_multiple_pull_requests_with_comment.json | 4 +- .../story_update_add_github_pull_request.json | 2 +- ..._add_github_pull_request_with_comment.json | 2 +- ...b_pull_request_without_workflow_state.json | 2 +- .../fixtures/story_update_add_label.json | 2 +- ...story_update_add_label_name_in_action.json | 2 +- .../story_update_add_multiple_labels.json | 2 +- .../fixtures/story_update_add_owner.json | 2 +- .../fixtures/story_update_change_epic.json | 4 +- .../story_update_change_estimate.json | 2 +- .../fixtures/story_update_change_project.json | 2 +- .../fixtures/story_update_change_state.json | 2 +- .../fixtures/story_update_change_title.json | 2 +- .../fixtures/story_update_change_type.json | 2 +- .../fixtures/story_update_description.json | 2 +- .../story_update_everything_at_once.json | 16 +-- ...verything_at_once_skip_removed_labels.json | 16 +-- .../story_update_multiple_at_once.json | 20 +-- .../story_update_multiple_not_supported.json | 6 +- .../story_update_remove_attachment.json | 2 +- .../story_update_remove_description.json | 2 +- .../fixtures/story_update_remove_epic.json | 2 +- .../story_update_remove_estimate.json | 2 +- .../fixtures/story_update_remove_label.json | 2 +- .../webhooks/{clubhouse => shortcut}/tests.py | 127 +++++++++--------- .../webhooks/{clubhouse => shortcut}/view.py | 6 +- 62 files changed, 143 insertions(+), 142 deletions(-) delete mode 100644 static/images/integrations/bot_avatars/clubhouse.png create mode 100644 static/images/integrations/bot_avatars/shortcut.png create mode 100644 static/images/integrations/bot_avatars/shortcut.svg delete mode 100644 static/images/integrations/clubhouse/001.png delete mode 100644 static/images/integrations/logos/clubhouse.svg create mode 100644 static/images/integrations/logos/shortcut.svg create mode 100644 static/images/integrations/shortcut/001.png rename zerver/webhooks/{clubhouse => shortcut}/__init__.py (100%) rename zerver/webhooks/{clubhouse => shortcut}/doc.md (65%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/epic_archive.json (100%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/epic_create.json (100%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/epic_create_story.json (93%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/epic_delete.json (89%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/epic_update_add_comment.json (100%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/epic_update_add_description.json (100%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/epic_update_change_description.json (100%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/epic_update_change_state.json (100%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/epic_update_change_title.json (100%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/epic_update_remove_description.json (100%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_archive.json (89%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_comment_updated.json (92%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_create.json (93%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_delete.json (100%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_task_complete.json (91%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_task_create.json (92%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_task_delete.json (91%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_task_not_complete.json (91%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_unarchive.json (89%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_add_attachment.json (91%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_add_comment.json (92%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_add_description.json (89%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_add_epic.json (90%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_add_estimate.json (88%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_add_github_branch.json (96%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_add_github_multiple_pull_requests.json (95%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_add_github_multiple_pull_requests_with_comment.json (94%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_add_github_pull_request.json (96%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_add_github_pull_request_with_comment.json (91%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_add_github_pull_request_without_workflow_state.json (96%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_add_label.json (91%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_add_label_name_in_action.json (91%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_add_multiple_labels.json (92%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_add_owner.json (90%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_change_epic.json (88%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_change_estimate.json (89%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_change_project.json (92%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_change_state.json (95%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_change_title.json (90%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_change_type.json (89%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_description.json (90%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_everything_at_once.json (91%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_everything_at_once_skip_removed_labels.json (91%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_multiple_at_once.json (79%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_multiple_not_supported.json (84%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_remove_attachment.json (91%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_remove_description.json (90%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_remove_epic.json (90%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_remove_estimate.json (88%) rename zerver/webhooks/{clubhouse => shortcut}/fixtures/story_update_remove_label.json (91%) rename zerver/webhooks/{clubhouse => shortcut}/tests.py (81%) rename zerver/webhooks/{clubhouse => shortcut}/view.py (99%) diff --git a/static/images/integrations/bot_avatars/clubhouse.png b/static/images/integrations/bot_avatars/clubhouse.png deleted file mode 100644 index af85333b18c51765341d4f91b5782f5403c0edfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2956 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

3kxgU7 z01AS9^6Z7vL^v512)%`|)YeCH6{1c0C98ZL))fv%y{>KUZkf8|Qu7HQCCa6CuW{5} za0~y(pku}W3V=Lv?!swMe3~LXK8Oudgo9OE2SkZuk_N>b#6gKsQUfk(5er9#iH8IHiaB0FAKu(ZHUcMMkQ$&^yWGu`VMqHzg9M+X!MS#a3 ziXOiM&_5(anEmijh{QP= zC7O~{2C;S?gebA(logv^(TIKD3&W_B3D>GjwV3Mc6vTLKC>fy;Rt|wLO4IazViI? sY;|)tVC=QMw%7LBUfXMX?J8>j4}}nh=v1VLcmMzZ07*qoM6N<$f}^$2ZvX%Q literal 0 HcmV?d00001 diff --git a/static/images/integrations/bot_avatars/shortcut.svg b/static/images/integrations/bot_avatars/shortcut.svg new file mode 100644 index 0000000000000000000000000000000000000000..e84982d351cd561bf82bb1f19dd255fad655bef1 GIT binary patch literal 1781 zcmd6oJ8#=C6ovQv3W8bMArvp)ETRnVD?@?~MV2mx5zDp!RWc+cO8$K>A1RX9O;ZCc zx)`7@#d|)UbEVVac1@;wIc`d-K~u7+>h)&C1qVuQ>uQ>HcO~V76D*VX@2YN^lD1u2 zQF8aaX@`<-#&P?uD5hy*lVn}LE(GViz{Ba;(dl+EZpgBvmtZXu1PpW1T?k-CIY+<> zCY`@XMJX)v3NEA+%xZX6O^<$~Bx$(mn>WYXMcs~k-qdZi=;y+6HCMvErN!gU={TQ{ zGpQMOB(_5_4|U}vQz!<7F$u6!Ph!m;1@IdM5s%A6@8vTupyP(RQ6_jD4k?3Auj z{JiMM=FbzV$X6f}q7r)=$$!;I?QgWKRs))toc-J{mUY#Rq{bxe_Z;I0B^6pSr!mU+ zVWAuoPGCip6u4zvJFLWoU>-RneEEc=fYN&8#aAKb9(|!gYW!zUhg?NE#Cr6pe7{y+rOI_!R7J42SYm~<=?a2XfK-?{yk|e zh6xM!_v{bc|M!=MjfMvsjlCbrAsjL>(Hq+N$hi%P91hQZ^gnmQ#wV$+?p|by7TsRQ zg5tPW_uNuW)QhFERb;|N_MpBud$yf-tjD=YImY_$RcX&d0`oC-8pFe!{a!sb(!~3r zigH08iIz}n&6v;9`g0;qV0{@L3Wavh%{_{)Z5%Fa_tUV6!$cRy!kC@-tZ2c@(S0q}MLL_{iQe)7>>!4!7^c@r={(IO4NIVw(=s{E8&;Wsq z5gDY8Flo-p2g18V_IPiz+e}g7;NV!n9(Z^Gmk!P?ZEXl_@rv4R#Psj_(3i^@ zo7Ki*nt!Ub^!H=kxd}7#|Ig=#$2u1VQOwQF*)~-a$70GiC%>XxNTpNv<^@6^tP1j~ zZ~r?QiBZZJS?v#Ycv9(&Q(asF%@d>VTR)GsfmyPyaqe?|{qHAji6Z*umbRDCBb9LE zw7>icHL>?79#KJn%&wU;A5i^!|Kaz)BMNuQEBb}Arr;Vyi{T&+-D}Ld#Q*b&F}Z#7 zB2)dL+yqzIKm?a~+38mEe^29S&&|$$hCtFqCwBD{L<06QrJmxy!Kjn`pTXGu`nuufImJL0%6b%d~u$AR)&n)!Z4GXB3e znKED}OK7n8CA|pEs@;}l{9e^!s3QI@Ht=Y6jQcujt;jQr1x3n>{QI&9axIx=XjcQqLO^dl?F~h;xxUVv)OYA_y)%rN;t~%kVNc_kAP94)=`@Mh%jpNjWM8 zTKkDfaZB6z-1g@FAENG$Y>U5Zv=~`^&QE2#>(o)>Ji@}Bi?s8^%d(MThRGydr*J%s zcb&Kyk>DeIZ{KsW#lM|O=@;+0ZoR}R+u9nsY~rbZ&g>|Pg-{^cim%%AvnQGQKXSGUy^ff@lN?X&M`H-d(RSwsp?Ir4OS*9FB$^tIr1# z`D>(Ovxf~+RZYm}l4EsI31m^R(6*a(_+nJE+oo)4z@njIqrb9M;eCSt#sJ#q%UIvk z-p%g*x516df4#%Jbbl`UdU`xjSO?p&sPkEqrm4pALO#LU)8`~V{6mqFno$l9 zfvwUVhfP-b$!YpUgsvnWj3YqsojR7b81~IoX{IAb5HIY;J`5Rs-;)>4&+8{J;0yV+n6i8E`e##M~Y>S&>88X z+wyDwYQoJu-jmI{=c}!*{@4*~@wm}hmf(17M&dBav6+<>EtdI2$Uh=T= z>w(44bETN7tRB~>XzA1f!Rbx=`w|m8LOYvZgKt(D9WN!jd!E1A?-1Lxy~0LI1aA8J zO+N%;8yYC}*?}?Qj7n6_j7nLVyDy-JPrC`MSym^7Q8ES*@6A{wA zwx2W;FQx8x?y+WIby!B*_-i7>;`PL92MZ-toq(aRpYr#76`b{I`CK`LgY34MZaTg(OLZEJk~ zoFw_is3xb}RL2c(;71<<#5OQk;vji0Vb@vO>U+~{{@Zig8@|4XyK%V2!2Gv~GnRIx zSa>;mtzzG-?ph@cIUl|P&chz(F!C(xRWXkrR2-T95qm4;B0}@PoZk%LVqIi<5q}-ByYpe#L}=|f%(4-(z+WHx>f7d~WmL?2f3cf=tCzepkJ@8p zGW~;4cj`l`!sN5X?Fp8IAg{GE!+QDGuO)I-mc#}m4ej_7&9M5SxjH_x(_Wim+wxP% z^fC>lJHPm>deCCXxhy6xO!$5*?A14K;X_O4k+S?>Q@{EnOP12;m-);90vmb1d)q9# ziE(6?#dO(Q)V{TSa|g>i%3;Q{BWon#`>)K_$LOgeJEb?*SPn}mIBorfhrKwi*X{bN zu)EeWF{NPE*xR6A8^=FKb`DREbYaU))aK<*?Zf&XAP_Y*l36xa%EpUzhSA*7ZhpJ@ zuig!^^lhtXbS35^_8_P1&O0Mk4K%7wHrhbTVACI@77*m|7yD+#e=4on!T4r~H9-2> zoq`fJna>69{^DbNR_GBMi*j`u(6t*Msi~!Qlkn{Pm7P&*%R@ZDnRR}fe^we+SC?8= zM!rxyA4FA$omO2A-y(Xqxlqh-_wqpMWOw+q%rydhq)0wEI-h4HbnjYGT?M(Ojsh8b zGg$hd2}@{MKT*)_z*D7Qp`0qaY%sk(4gKL8MxJB;viLD;`0+=$9rC$gwYvJ<*PeXR z$tGyv`AbsF$!bT2%A3+I!JbqN1a}eLlO2lCt#_RtkG%0LtxDY^>5f-F6x^=iWMm~t zy!n6xk8lGP3e&vq3%OJ%>Ex=jIW{XR4kpbsjo-TvsJed>NA4YlVfRl&3CVHY`?|A? zMO};oi<4u>@6^LuIrpV1k+VlU#klP8gaNM3i}Q8n-wZeqyQr1$}d;dpv+f_jKw=h)CZ zJwu+$vD>YSb91fZWdCRmGg*g+n8yiY7dOJH4V_Jj*KWSyo6eNdIG<%N-}nS7j_2Yo z9s~+EtXOvaAR`s#JS=maX<(4tq=4KkM4m4W)Jz~ih+jCNIOAl%Lws@e{02pwhO=;D zXEs8dQ`)vT_#hrlZra~HAi6gd$B$HRO7Nx(Y*I(IO5IMS)9Ow-o~~UO-KM;rh9V*% zJq>fNrlT*z_^QJL$Mc(%6TLjPCoPBgGH{9h36$F=z`nzX9L&Ds~**YPdoBFIPW4|^= zLuLDZ4p*cSf|rg_MJJLnkNdE&Qz5*ElDd7glj!m%3R#esUeAf)QF2Ut)wEe7iCXNK z5Eh*d7)d)tm&7`we%&#TkXwCt72t5W5L$jkX=ca9M`h7aMOYydT~hS3gb>Lm^TK39 zwEk|Hpt`a}|0UMi8p%opwDFa^xo3%d`tYaoWWo%}o@VIV1&N8t*NH26c_xRwns39( z&;1P>)^28?RIR|(VSk!vJgZ`}`wz`BRZUde=Xv@LD)x zexJ5cCbP3;l@qeQF$! zxF(@6(laVSUpKVF*gY@0X~XSXS6B~Jy~(JqzY;i4hQa5R*kJdi>r4wYy-d2IVX8Wu zrLihulG_lt=AMxatD_Ug0<8wJ;umh1E1j4|r_LsY<2rpvK2I-B`e+WjbgwD61OAlB zMC}WG%V>~>{U(5}6wO!|o}UkEfizff_vLxxoqbZtz~G=X;ru9h85Jb@xSbI}|;8JXVF<@NS*?PSk!9MJkhTG(fX>EOsH^HTG(#Rhn zQ`k~tQ!})6>L0TE?dMMq`g03&2O1iZkyH_y^kIj~q=aWIEXW1}S|0MnBw{xg)udX# zS@UoXp5ogE2dw^h`d3yMefH;%0-C}jX-Qu$@|^1{2ffy6y^B2@n~vzH(ci>K7m&rh zwEzG{2{TO^{AlKk*@1wOJQeC9PYr}%m^+#cuW#yC`K~+d_RqQ^> zjwvJSi(Y%l9j^l~7J1?2tz05|R{vBA9iOBJYos4t+Qv7jDz)fc!m;|;+Dkg_L*`*& zzO6y=;zHaQgjNd=-AxI<^NNCc{Bw~re3?F`oohNfNe6W{6=UY!-siO8uPyghm9Ryi zZ%wB^C9h6^x;>Q^E=NTLBa&_V6uBNYoxM3Ml-0wp68gdci$96l!!ZqIr$p>Sc5Ak7 zQRlS)>G#c z5=*xp?K=L!*wT_;h?Ga<(bEHNZ|WtxTu-KC^d4hCVCUzeRgZy8S62?u*Z%H{mI<(53Y%0Y?(WBOf#GdeE9Yj{5J+7F_6!#6Jrh^5)&;S3 z!FG{m(KDYkWMCEy?1P++ZXmpqdbM~Mq})SLB0D%@0XlD$qi^egKi1bK=)@*yb(Ypj zuRG8BIJ}G_xl`+n)b^1Lbph-BSj9z?dxM{X@I{sQI%&225##9ixZd%>o3v9NSsD~b zTDGEwGxNmgctERj?kG`PI{@Lq}k3*U%88Y`?dSPCf#at;BiarP&!3UqyBs#PmL(=)x;k~FW~l~X@FB602S31E zo`qZVd&gU{#4{mDI#^P=x4cc8GsX_CNGjAN`&L|{a2!>X3$nUO)Qb41IvjW5Lz}bo zaaditw2Rv3lpas{VlRzCsr4R?)_dqve6(7-VBe+`1%~sezbe=w)$tm6cLBPYLafb+ zcc`#J6yz$2CgDRdj}%?SPf(hj9+T^{mpIsau|o(318b?3mDnKE5BJFvMf4CzEf!Ou zq>gQsoWEj{!rTcJy6(5hMMk>Pn+$8@?y{u^SiAU1pzf^%;rw6%ADV)otsh&2^MPkN zBjXFZ?{7pcQaGq^=AAKaZe2m{I^65Ux>!z3fy8+YDl};Y(za*jG-<~+@Wt;#= zrGD5(KMNf+^=mw6vZp50S>QO3df~7uuQ#RKxz@SE@O{5|PsCQ1&|%)DOIGk~Xiw}- z@M&V@N-(qu9^%qyi}iI7;Fp@GXB}j`b)EPRyf;;~CkY zpjBvpsV?)qbEal>St7o-G)bw;UM4h$d!!ZeZSaDTQi?;4--wuQ3P@r*c^rm zShQBZ6kpsj!Y)3ilI{34=ng4VMM)p_*X6$RaTmGv$gzOV-CNK$AI#+^$}LO>KCMsT z(-+*Yy+uYuL3sr=Qh6mQNu=Xw5>RpgOTC4S_hEP+>;@J5a~%*iY2&=tUWOtZ4t{Vu2DPD3RK1@u;BWX2 z!Yb{Wp>K)HTzRR(VG2%QZ;2L%af!H;LDd)_NWM!d43bD`_I*|s>(8{r-A&el?qr*Up^8vTiRI(UJ}1<>z6|YBxFzlM|Z!;++2?@C|u5TYQ0b) z=~AO87vo$*#~3n}OxNEw)f;p|<(l>gV^(SR z$bplamM<<3FvJ{iAlmwLrHiEkK8ai*)lxhba$<63NhLP}CJKSZd05nO9z42EGU}>~ z#wDkN4a{!tg=6C;j)!R|hbvVFp8!mL_zHa~?AFnMQw3rw`8O8DRYOeBfd=Y_e1ABn zzj(0W754F1gqYiWiuR`d=Eem!U^3|6`0M&?E5xx%o8iU5q-%GU*$&=C64hcAcYW1p z{lV`Zg~0DJsUtJ;7shCZeZ4ytA-ZNu4L*s9zrUt^=84BlPNq&8rTd%7`^EqMcEN!9 zDC?d(M)P*hh%+JKHw}gUZB?~u_OBis6XWP^VUuKvVufN}THDY7bib71n(fZg6#yko zP&`Z+f_?Mz`B<+GHwq!Y$>ui0%~J0F43jQay=rrs3Y~S=q;s}!43paTmP=q0b0{1( zG!xStZd~!3DG1ylX4WVw%1udp^ps27R@!vG|4e+UrfPIy5fDY~hsZW)<5WRQ!6 z4UvzxS$k=<6Ikyj7_C4$D-pEmyy&ZR-ac_eIVn$WcpyoZk5F`^j)pO5>j7pX6j~-E z-SiV~SoU7?ZCMNW&5@R}VaB82r7~TXjZHZ$r5{4shkvWJvA}U%wv-2O*IwOr3T%^% z#)QL@9TG$u<3AaPny+svzI3+eZ&I_Ak!5FROex@op6I^7>?D(xQLs0WosNitR8=e~j0Zu(4Mxb2P1W;s{=!EPdsxw+h&U=Ge<@i=UrUC+$U zuF$YSD!+k~X`z&-?(cSnM(a$z+ef8$e2I>A8V<~nGMcC7Ij0cqnz}@}WZT_~XQaXF zmW>wQF5WoxMVi~5^8~+pwhfoiMqqYUTys>RF9X%Xk$bt@KZfc6^HX}8 zWFJ6=%>0c@-LD$vAJwzet7y)oEwP6B*r_8!kR&rnXVY{z_j0@T+e=R(6&Z~cwbR=v z4%~ds@6VaDWJv>NERtx^3*mm|sLvk6&R<}%eu#cunw{p8qGmg zLfjNFgGLvqLpgW|VRqX;N)FO-Miut8)SqA@?e)*P@;$_TtR|1bokE^z8WgQ`BvrE$ zvrk8J?cNTl1DbkDM(Njl5$Q#1pv*L#ttWUWUO^PAi?qud)7Z3i@{5Wv&es#a;=T&? z{MLHK??}OO(B9cEu(xlZR~!|YX$Dw&BLaV&ttFw4$qazqM2#$)X7{@=XU}DO86o7p z0h@PfozCfIVPs48^1NSfEX=c3eWw~J)nM_Ri z5`B%rl}%azFf(IoGci$8_;yM8>90*#tN`-rx>lMV7^~j+zFwXnG@{C6|1-{zCkjXqR=8CR*BDR{fvySAUE+&a+y4BjPa`cAfW z&q-dcZ;)&}5JXtqN!a5@*T2e|+FpE-{*FVFuvyYLjd5^IU+$XWq;d5u zvH8l{eqY%85}L?h8qIStRgt9=4+=urwwl=FIVQi6Qr`D+uh&jBQNO$3|LlNnvuUT-ku_nO+>v?DG@Q3JAeYkNwI90$V^&9S-Zh+|@YL#y*E zEnyT$5gAwaz8m0>(2Jq;Pch)!3=Mx8HgRlNOA@qm`#mh01IgiOOhkewMb=F5B@5+> zhY9CnK?zhC$FBiyry>GXGtONTXQRFfQ}+0h-8!t+Bdn3GrRa{(icKSe9c_xlC&-Wt z)uxRE?z<3Oc?pLcw%mTMbmXNm5^4)83UQS4ipwrB=@M+f9%((Yu`wB!<1@fIVAj&o z8e--~->_lf7HEf7!l)r);@=k6w%`hrrca2XzZ1{>^vA^UO3NeH)1&29Acz;gDXNas zMT}4UZRB3`m)o42(?|BOne~#IPSztpN~}-6c8iMF0;Ry;T7b2Ez%j;_C>VV}0?Y_T z@c7MVJ6YRmL*dSKM&|tH4c%fQrc?=OJ3QlQP09+U6q|!2o++vzH7$)0UH2I*2&lVy zAWem!FX`iFp?jR;AdniG$4$}Oo8DTMKZ*gj#N&UK`(oB5*EA$vt@)#a!%WSqhh!wa zv^8^7C$iFs-2oLDpLlm=Jf%>G?zMY(c!)0}q&_iSHCg?ILB))+p+ME7WNCt`)jCDT z${!V~MRl*|b=?B!4OC_~ou+YJF#A!9q< zAJ+BStJhni1F(fSeygZCyi;NT7#ZY9X=hOd9IpgJKp+GCtnVQT zds9t+&@$>Gs?tJE-zfsCKqra!09UZLP9mmD#1hZIBgIuZEo8 zWxo9wXna)fSDCecUE)1%iPo{goN(mrNothXo-P zP)JY={OFfV$~)}&_Cu(?%J7Z7Pi32gbz>Q?n+`sI8REq=UsaUf!gNyB;xm+&?<1u%i` z!dkxRUE2o{bNtSEhQwPi7Ft*tI-I-uFQj;e!B)^EY5IwH@3cjCQ)>rJcV&y0b+A7~ zc^Doy!AVT)a|r?sUtdJjVo=PBJ7@#;u`Ah49QBGB9sMnAD^?^;b*e03`b@p`dOJY_ z5`uH^OFoG}u9DwrwOQ(%YUJb0z?0+dTZp^vaHT6sD42dOF*93G!M}|uYQZt7)_ zo(|9qJXcTKF?LwiNmgLt1fWBtgF26J<9fI|a*RhrWb_+ z6+86k#$*YBdrU$8^H&VI8v-Y&g>6VlQE7PVjW>Y7j7;WE)O-f(gmi$ev1q&@+;@aI z>T%v|r?_|3%FW=B;h|?LKSf-%s6QvVyB@HC{QjaRCJygort9*HnB+JRc9VwUW6uym z69Nbz1+vXk`F23<)E}od(p#u=8V4r8hN|niqVlQpxR%cCT|1@4Y`M&Is_2jL;G-%XvYEWTkXQW># zH+-V8P>@YvQ|2}AZ4a+LtVNqVnPGvfhmS$$∼yg{=cN3!Ef>uM6{zA6Z_7muZc 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 literal 0 HcmV?d00001 diff --git a/static/images/integrations/shortcut/001.png b/static/images/integrations/shortcut/001.png new file mode 100644 index 0000000000000000000000000000000000000000..df23ef3de0463fdd8980083e84015336821cd202 GIT binary patch literal 40122 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 Cnv_rg literal 0 HcmV?d00001 diff --git a/zerver/lib/integrations.py b/zerver/lib/integrations.py index e262162f7e..743671814b 100644 --- a/zerver/lib/integrations.py +++ b/zerver/lib/integrations.py @@ -388,7 +388,6 @@ WEBHOOK_INTEGRATIONS: list[WebhookIntegration] = [ WebhookIntegration("buildbot", ["continuous-integration"], display_name="Buildbot"), WebhookIntegration("canarytoken", ["monitoring"], display_name="Thinkst Canarytokens"), WebhookIntegration("circleci", ["continuous-integration"], display_name="CircleCI"), - WebhookIntegration("clubhouse", ["project-management"]), WebhookIntegration("codeship", ["continuous-integration", "deployment"]), WebhookIntegration("crashlytics", ["monitoring"]), WebhookIntegration("dialogflow", ["customer-support"], display_name="Dialogflow"), @@ -494,6 +493,7 @@ WEBHOOK_INTEGRATIONS: list[WebhookIntegration] = [ display_name="Slack-compatible webhook", logo="images/integrations/logos/slack.svg", ), + WebhookIntegration("shortcut", ["project-management"], legacy_names=["clubhouse"]), WebhookIntegration("slack", ["communication"]), WebhookIntegration("sonarqube", ["continuous-integration"], display_name="SonarQube"), WebhookIntegration("sonarr", ["entertainment"], display_name="Sonarr"), @@ -757,7 +757,6 @@ DOC_SCREENSHOT_CONFIG: dict[str, list[BaseScreenshotConfig]] = { ScreenshotConfig("bitbucket_job_completed.json", image_name="001.png"), ScreenshotConfig("github_job_completed.json", image_name="002.png"), ], - "clubhouse": [ScreenshotConfig("story_create.json")], "codeship": [ScreenshotConfig("error_build.json")], "crashlytics": [ScreenshotConfig("issue_message.json")], "delighted": [ScreenshotConfig("survey_response_updated_promoter.json")], @@ -822,6 +821,7 @@ DOC_SCREENSHOT_CONFIG: dict[str, list[BaseScreenshotConfig]] = { ScreenshotConfig("event_for_exception_python.json"), ScreenshotConfig("issue_assigned_to_team.json", "002.png"), ], + "shortcut": [ScreenshotConfig("story_create.json")], "slack": [ScreenshotConfig("message_info.txt")], "sonarqube": [ScreenshotConfig("error.json")], "sonarr": [ScreenshotConfig("sonarr_episode_grabbed.json")], diff --git a/zerver/webhooks/clubhouse/__init__.py b/zerver/webhooks/shortcut/__init__.py similarity index 100% rename from zerver/webhooks/clubhouse/__init__.py rename to zerver/webhooks/shortcut/__init__.py diff --git a/zerver/webhooks/clubhouse/doc.md b/zerver/webhooks/shortcut/doc.md similarity index 65% rename from zerver/webhooks/clubhouse/doc.md rename to zerver/webhooks/shortcut/doc.md index 88b675f612..ee73ae0608 100644 --- a/zerver/webhooks/clubhouse/doc.md +++ b/zerver/webhooks/shortcut/doc.md @@ -1,6 +1,6 @@ -# Zulip Clubhouse integration +# Zulip Shortcut integration -Get Zulip notifications for your Clubhouse Stories and Epics! +Get Zulip notifications for your Shortcut Stories and Epics! {start_tabs} @@ -8,7 +8,7 @@ Get Zulip notifications for your Clubhouse Stories and Epics! 1. {!generate-webhook-url-basic.md!} -1. Go to your Clubhouse Dashboard, and click on the settings icon in the +1. Go to your Shortcut Dashboard, and click on your profile icon in the top-right corner. Go to **Integrations**, and select **Webhooks**. Click **+ Add New Webhook**. @@ -19,7 +19,7 @@ Get Zulip notifications for your Clubhouse Stories and Epics! {!congrats.md!} -![](/static/images/integrations/clubhouse/001.png) +![](/static/images/integrations/shortcut/001.png) {!event-filtering-additional-feature.md!} diff --git a/zerver/webhooks/clubhouse/fixtures/epic_archive.json b/zerver/webhooks/shortcut/fixtures/epic_archive.json similarity index 100% rename from zerver/webhooks/clubhouse/fixtures/epic_archive.json rename to zerver/webhooks/shortcut/fixtures/epic_archive.json diff --git a/zerver/webhooks/clubhouse/fixtures/epic_create.json b/zerver/webhooks/shortcut/fixtures/epic_create.json similarity index 100% rename from zerver/webhooks/clubhouse/fixtures/epic_create.json rename to zerver/webhooks/shortcut/fixtures/epic_create.json diff --git a/zerver/webhooks/clubhouse/fixtures/epic_create_story.json b/zerver/webhooks/shortcut/fixtures/epic_create_story.json similarity index 93% rename from zerver/webhooks/clubhouse/fixtures/epic_create_story.json rename to zerver/webhooks/shortcut/fixtures/epic_create_story.json index 32715fba6a..bbf608c7df 100644 --- a/zerver/webhooks/clubhouse/fixtures/epic_create_story.json +++ b/zerver/webhooks/shortcut/fixtures/epic_create_story.json @@ -9,7 +9,7 @@ "id":23, "entity_type":"story", "action":"create", - "app_url":"https://app.clubhouse.io/zulip/story/23", + "app_url":"https://app.shortcut.com/zulip/story/23", "description":"", "story_type":"feature", "name":"An epic story!", @@ -30,7 +30,7 @@ "action":"update", "name":"Add super cool feature!", "story_type":"bug", - "app_url":"https://app.clubhouse.io/zulip/story/11", + "app_url":"https://app.shortcut.com/zulip/story/11", "changes":{ "subject_story_link_ids":{ "adds":[ diff --git a/zerver/webhooks/clubhouse/fixtures/epic_delete.json b/zerver/webhooks/shortcut/fixtures/epic_delete.json similarity index 89% rename from zerver/webhooks/clubhouse/fixtures/epic_delete.json rename to zerver/webhooks/shortcut/fixtures/epic_delete.json index 8e4faba551..52226eb02d 100644 --- a/zerver/webhooks/clubhouse/fixtures/epic_delete.json +++ b/zerver/webhooks/shortcut/fixtures/epic_delete.json @@ -9,7 +9,7 @@ "id":17, "entity_type":"epic", "action":"delete", - "name":"Clubhouse Fork" + "name":"Shortcut Fork" } ] } diff --git a/zerver/webhooks/clubhouse/fixtures/epic_update_add_comment.json b/zerver/webhooks/shortcut/fixtures/epic_update_add_comment.json similarity index 100% rename from zerver/webhooks/clubhouse/fixtures/epic_update_add_comment.json rename to zerver/webhooks/shortcut/fixtures/epic_update_add_comment.json diff --git a/zerver/webhooks/clubhouse/fixtures/epic_update_add_description.json b/zerver/webhooks/shortcut/fixtures/epic_update_add_description.json similarity index 100% rename from zerver/webhooks/clubhouse/fixtures/epic_update_add_description.json rename to zerver/webhooks/shortcut/fixtures/epic_update_add_description.json diff --git a/zerver/webhooks/clubhouse/fixtures/epic_update_change_description.json b/zerver/webhooks/shortcut/fixtures/epic_update_change_description.json similarity index 100% rename from zerver/webhooks/clubhouse/fixtures/epic_update_change_description.json rename to zerver/webhooks/shortcut/fixtures/epic_update_change_description.json diff --git a/zerver/webhooks/clubhouse/fixtures/epic_update_change_state.json b/zerver/webhooks/shortcut/fixtures/epic_update_change_state.json similarity index 100% rename from zerver/webhooks/clubhouse/fixtures/epic_update_change_state.json rename to zerver/webhooks/shortcut/fixtures/epic_update_change_state.json diff --git a/zerver/webhooks/clubhouse/fixtures/epic_update_change_title.json b/zerver/webhooks/shortcut/fixtures/epic_update_change_title.json similarity index 100% rename from zerver/webhooks/clubhouse/fixtures/epic_update_change_title.json rename to zerver/webhooks/shortcut/fixtures/epic_update_change_title.json diff --git a/zerver/webhooks/clubhouse/fixtures/epic_update_remove_description.json b/zerver/webhooks/shortcut/fixtures/epic_update_remove_description.json similarity index 100% rename from zerver/webhooks/clubhouse/fixtures/epic_update_remove_description.json rename to zerver/webhooks/shortcut/fixtures/epic_update_remove_description.json diff --git a/zerver/webhooks/clubhouse/fixtures/story_archive.json b/zerver/webhooks/shortcut/fixtures/story_archive.json similarity index 89% rename from zerver/webhooks/clubhouse/fixtures/story_archive.json rename to zerver/webhooks/shortcut/fixtures/story_archive.json index 10bb476126..e3fcde2625 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_archive.json +++ b/zerver/webhooks/shortcut/fixtures/story_archive.json @@ -11,7 +11,7 @@ "action":"update", "name":"Story 2", "story_type":"feature", - "app_url":"https://app.clubhouse.io/zulip/story/9", + "app_url":"https://app.shortcut.com/zulip/story/9", "changes":{ "archived":{ "new":true, diff --git a/zerver/webhooks/clubhouse/fixtures/story_comment_updated.json b/zerver/webhooks/shortcut/fixtures/story_comment_updated.json similarity index 92% rename from zerver/webhooks/clubhouse/fixtures/story_comment_updated.json rename to zerver/webhooks/shortcut/fixtures/story_comment_updated.json index 0f45550737..cac9830e7b 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_comment_updated.json +++ b/zerver/webhooks/shortcut/fixtures/story_comment_updated.json @@ -25,7 +25,7 @@ "entity_type":"story", "name":"Add super cool feature!", "story_type":"bug", - "app_url":"https://app.clubhouse.io/zulip/story/11" + "app_url":"https://app.shortcut.com/zulip/story/11" } ] } diff --git a/zerver/webhooks/clubhouse/fixtures/story_create.json b/zerver/webhooks/shortcut/fixtures/story_create.json similarity index 93% rename from zerver/webhooks/clubhouse/fixtures/story_create.json rename to zerver/webhooks/shortcut/fixtures/story_create.json index b6aa5ccad5..b12515f7d1 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_create.json +++ b/zerver/webhooks/shortcut/fixtures/story_create.json @@ -11,7 +11,7 @@ "action":"create", "name":"Add cool feature!", "story_type":"feature", - "app_url":"https://app.clubhouse.io/zulip/story/11", + "app_url":"https://app.shortcut.com/zulip/story/11", "project_id":6, "description":"We should probably add this cool feature!", "workflow_state_id":500000008, diff --git a/zerver/webhooks/clubhouse/fixtures/story_delete.json b/zerver/webhooks/shortcut/fixtures/story_delete.json similarity index 100% rename from zerver/webhooks/clubhouse/fixtures/story_delete.json rename to zerver/webhooks/shortcut/fixtures/story_delete.json diff --git a/zerver/webhooks/clubhouse/fixtures/story_task_complete.json b/zerver/webhooks/shortcut/fixtures/story_task_complete.json similarity index 91% rename from zerver/webhooks/clubhouse/fixtures/story_task_complete.json rename to zerver/webhooks/shortcut/fixtures/story_task_complete.json index b6f4ac5426..0e8febecbf 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_task_complete.json +++ b/zerver/webhooks/shortcut/fixtures/story_task_complete.json @@ -25,7 +25,7 @@ "entity_type":"story", "name":"Add cool feature!", "story_type":"bug", - "app_url":"https://app.clubhouse.io/zulip/story/11" + "app_url":"https://app.shortcut.com/zulip/story/11" } ] } diff --git a/zerver/webhooks/clubhouse/fixtures/story_task_create.json b/zerver/webhooks/shortcut/fixtures/story_task_create.json similarity index 92% rename from zerver/webhooks/clubhouse/fixtures/story_task_create.json rename to zerver/webhooks/shortcut/fixtures/story_task_create.json index e53babe209..e70f288844 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_task_create.json +++ b/zerver/webhooks/shortcut/fixtures/story_task_create.json @@ -18,7 +18,7 @@ "action":"update", "name":"Add cool feature!", "story_type":"bug", - "app_url":"https://app.clubhouse.io/zulip/story/11", + "app_url":"https://app.shortcut.com/zulip/story/11", "changes":{ "task_ids":{ "adds":[ diff --git a/zerver/webhooks/clubhouse/fixtures/story_task_delete.json b/zerver/webhooks/shortcut/fixtures/story_task_delete.json similarity index 91% rename from zerver/webhooks/clubhouse/fixtures/story_task_delete.json rename to zerver/webhooks/shortcut/fixtures/story_task_delete.json index e7059a280f..cb6aa7c935 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_task_delete.json +++ b/zerver/webhooks/shortcut/fixtures/story_task_delete.json @@ -17,7 +17,7 @@ "action":"update", "name":"Add cool feature!", "story_type":"bug", - "app_url":"https://app.clubhouse.io/zulip/story/11", + "app_url":"https://app.shortcut.com/zulip/story/11", "changes":{ "task_ids":{ "removes":[ diff --git a/zerver/webhooks/clubhouse/fixtures/story_task_not_complete.json b/zerver/webhooks/shortcut/fixtures/story_task_not_complete.json similarity index 91% rename from zerver/webhooks/clubhouse/fixtures/story_task_not_complete.json rename to zerver/webhooks/shortcut/fixtures/story_task_not_complete.json index 3497610f26..6df0046cfb 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_task_not_complete.json +++ b/zerver/webhooks/shortcut/fixtures/story_task_not_complete.json @@ -25,7 +25,7 @@ "entity_type":"story", "name":"Add cool feature!", "story_type":"bug", - "app_url":"https://app.clubhouse.io/zulip/story/11" + "app_url":"https://app.shortcut.com/zulip/story/11" } ] } diff --git a/zerver/webhooks/clubhouse/fixtures/story_unarchive.json b/zerver/webhooks/shortcut/fixtures/story_unarchive.json similarity index 89% rename from zerver/webhooks/clubhouse/fixtures/story_unarchive.json rename to zerver/webhooks/shortcut/fixtures/story_unarchive.json index 35c4289acd..35d765fa5b 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_unarchive.json +++ b/zerver/webhooks/shortcut/fixtures/story_unarchive.json @@ -11,7 +11,7 @@ "action":"update", "name":"Story 2", "story_type":"feature", - "app_url":"https://app.clubhouse.io/zulip/story/9", + "app_url":"https://app.shortcut.com/zulip/story/9", "changes":{ "archived":{ "new":false, diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_add_attachment.json b/zerver/webhooks/shortcut/fixtures/story_update_add_attachment.json similarity index 91% rename from zerver/webhooks/clubhouse/fixtures/story_update_add_attachment.json rename to zerver/webhooks/shortcut/fixtures/story_update_add_attachment.json index e4fbf321ac..65ef47358e 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_add_attachment.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_add_attachment.json @@ -11,7 +11,7 @@ "action":"update", "name":"Add cool feature!", "story_type":"feature", - "app_url":"https://app.clubhouse.io/zulip/story/11", + "app_url":"https://app.shortcut.com/zulip/story/11", "changes":{ "file_ids":{ "adds":[ diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_add_comment.json b/zerver/webhooks/shortcut/fixtures/story_update_add_comment.json similarity index 92% rename from zerver/webhooks/clubhouse/fixtures/story_update_add_comment.json rename to zerver/webhooks/shortcut/fixtures/story_update_add_comment.json index 6bf0a316d1..6ba70c4f04 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_add_comment.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_add_comment.json @@ -18,7 +18,7 @@ "action":"update", "name":"Add cool feature!", "story_type":"feature", - "app_url":"https://app.clubhouse.io/zulip/story/11", + "app_url":"https://app.shortcut.com/zulip/story/11", "changes":{ "comment_ids":{ "adds":[ diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_add_description.json b/zerver/webhooks/shortcut/fixtures/story_update_add_description.json similarity index 89% rename from zerver/webhooks/clubhouse/fixtures/story_update_add_description.json rename to zerver/webhooks/shortcut/fixtures/story_update_add_description.json index b5931c03b0..06a8158e39 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_add_description.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_add_description.json @@ -11,7 +11,7 @@ "action":"update", "name":"Story 2", "story_type":"feature", - "app_url":"https://app.clubhouse.io/zulip/story/9", + "app_url":"https://app.shortcut.com/zulip/story/9", "changes":{ "description":{ "new":"Added a description.", diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_add_epic.json b/zerver/webhooks/shortcut/fixtures/story_update_add_epic.json similarity index 90% rename from zerver/webhooks/clubhouse/fixtures/story_update_add_epic.json rename to zerver/webhooks/shortcut/fixtures/story_update_add_epic.json index 2413d2c0ce..b175615656 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_add_epic.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_add_epic.json @@ -11,7 +11,7 @@ "action":"update", "name":"Add cool feature!", "story_type":"feature", - "app_url":"https://app.clubhouse.io/zulip/story/11", + "app_url":"https://app.shortcut.com/zulip/story/11", "changes":{ "epic_id":{ "new":7 diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_add_estimate.json b/zerver/webhooks/shortcut/fixtures/story_update_add_estimate.json similarity index 88% rename from zerver/webhooks/clubhouse/fixtures/story_update_add_estimate.json rename to zerver/webhooks/shortcut/fixtures/story_update_add_estimate.json index 94f1da18c9..b58da96d48 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_add_estimate.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_add_estimate.json @@ -11,7 +11,7 @@ "action":"update", "name":"Add cool feature!", "story_type":"bug", - "app_url":"https://app.clubhouse.io/zulip/story/11", + "app_url":"https://app.shortcut.com/zulip/story/11", "changes":{ "estimate":{ "new":4 diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_add_github_branch.json b/zerver/webhooks/shortcut/fixtures/story_update_add_github_branch.json similarity index 96% rename from zerver/webhooks/clubhouse/fixtures/story_update_add_github_branch.json rename to zerver/webhooks/shortcut/fixtures/story_update_add_github_branch.json index a74fbb9719..0d2ba1655f 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_add_github_branch.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_add_github_branch.json @@ -17,7 +17,7 @@ "action":"update", "name":"Testing pull requests with Story", "story_type":"feature", - "app_url":"https://app.clubhouse.io/zulip/story/27", + "app_url":"https://app.shortcut.com/zulip/story/27", "changes":{ "branch_ids":{ "adds":[ diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_add_github_multiple_pull_requests.json b/zerver/webhooks/shortcut/fixtures/story_update_add_github_multiple_pull_requests.json similarity index 95% rename from zerver/webhooks/clubhouse/fixtures/story_update_add_github_multiple_pull_requests.json rename to zerver/webhooks/shortcut/fixtures/story_update_add_github_multiple_pull_requests.json index 9bd2ec7b6d..72bbad297f 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_add_github_multiple_pull_requests.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_add_github_multiple_pull_requests.json @@ -25,7 +25,7 @@ "action": "update", "name": "Story1", "story_type": "feature", - "app_url": "https://app.clubhouse.io/pig208/story/17", + "app_url": "https://app.shortcut.com/pig208/story/17", "changes": { "pull_request_ids": { "adds": [ @@ -55,7 +55,7 @@ "action": "update", "name": "Story2", "story_type": "feature", - "app_url": "https://app.clubhouse.io/pig208/story/18", + "app_url": "https://app.shortcut.com/pig208/story/18", "changes": { "pull_request_ids": { "adds": [ diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_add_github_multiple_pull_requests_with_comment.json b/zerver/webhooks/shortcut/fixtures/story_update_add_github_multiple_pull_requests_with_comment.json similarity index 94% rename from zerver/webhooks/clubhouse/fixtures/story_update_add_github_multiple_pull_requests_with_comment.json rename to zerver/webhooks/shortcut/fixtures/story_update_add_github_multiple_pull_requests_with_comment.json index 18d8c902af..e941fae494 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_add_github_multiple_pull_requests_with_comment.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_add_github_multiple_pull_requests_with_comment.json @@ -18,7 +18,7 @@ "action": "update", "name": "new1", "story_type": "feature", - "app_url": "https://app.clubhouse.io/pig208/story/26", + "app_url": "https://app.shortcut.com/pig208/story/26", "changes": { "pull_request_ids": { "adds": [ @@ -48,7 +48,7 @@ "action": "update", "name": "new2", "story_type": "feature", - "app_url": "https://app.clubhouse.io/pig208/story/27", + "app_url": "https://app.shortcut.com/pig208/story/27", "changes": { "pull_request_ids": { "adds": [ diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_add_github_pull_request.json b/zerver/webhooks/shortcut/fixtures/story_update_add_github_pull_request.json similarity index 96% rename from zerver/webhooks/clubhouse/fixtures/story_update_add_github_pull_request.json rename to zerver/webhooks/shortcut/fixtures/story_update_add_github_pull_request.json index 904f6d28e5..f0940530aa 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_add_github_pull_request.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_add_github_pull_request.json @@ -30,7 +30,7 @@ "action":"update", "name":"Testing pull requests with Story", "story_type":"feature", - "app_url":"https://app.clubhouse.io/zulip/story/28", + "app_url":"https://app.shortcut.com/zulip/story/28", "changes":{ "started":{ "new":true, diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_add_github_pull_request_with_comment.json b/zerver/webhooks/shortcut/fixtures/story_update_add_github_pull_request_with_comment.json similarity index 91% rename from zerver/webhooks/clubhouse/fixtures/story_update_add_github_pull_request_with_comment.json rename to zerver/webhooks/shortcut/fixtures/story_update_add_github_pull_request_with_comment.json index c226e88be5..12af01be9d 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_add_github_pull_request_with_comment.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_add_github_pull_request_with_comment.json @@ -18,7 +18,7 @@ "action": "update", "name": "asd2", "story_type": "bug", - "app_url": "https://app.clubhouse.io/pig208/story/15", + "app_url": "https://app.shortcut.com/pig208/story/15", "changes": { "pull_request_ids": { diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_add_github_pull_request_without_workflow_state.json b/zerver/webhooks/shortcut/fixtures/story_update_add_github_pull_request_without_workflow_state.json similarity index 96% rename from zerver/webhooks/clubhouse/fixtures/story_update_add_github_pull_request_without_workflow_state.json rename to zerver/webhooks/shortcut/fixtures/story_update_add_github_pull_request_without_workflow_state.json index 0f9ad4b321..cdbae69e03 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_add_github_pull_request_without_workflow_state.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_add_github_pull_request_without_workflow_state.json @@ -30,7 +30,7 @@ "action":"update", "name":"Testing pull requests with Story", "story_type":"feature", - "app_url":"https://app.clubhouse.io/zulip/story/28", + "app_url":"https://app.shortcut.com/zulip/story/28", "changes":{ "started":{ "new":true, diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_add_label.json b/zerver/webhooks/shortcut/fixtures/story_update_add_label.json similarity index 91% rename from zerver/webhooks/clubhouse/fixtures/story_update_add_label.json rename to zerver/webhooks/shortcut/fixtures/story_update_add_label.json index 63fd910af5..58206703bb 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_add_label.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_add_label.json @@ -11,7 +11,7 @@ "action":"update", "name":"An epic story!", "story_type":"feature", - "app_url":"https://app.clubhouse.io/zulip/story/23", + "app_url":"https://app.shortcut.com/zulip/story/23", "changes":{ "label_ids":{ "adds":[ diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_add_label_name_in_action.json b/zerver/webhooks/shortcut/fixtures/story_update_add_label_name_in_action.json similarity index 91% rename from zerver/webhooks/clubhouse/fixtures/story_update_add_label_name_in_action.json rename to zerver/webhooks/shortcut/fixtures/story_update_add_label_name_in_action.json index 9344fb9c8c..ac842504a3 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_add_label_name_in_action.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_add_label_name_in_action.json @@ -16,7 +16,7 @@ } }, "id":11200, - "app_url":"https:\/\/app.clubhouse.io\/zulip\/story\/28", + "app_url":"https:\/\/app.shortcut.com\/zulip\/story\/28", "name":"An emotional story!" }, { diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_add_multiple_labels.json b/zerver/webhooks/shortcut/fixtures/story_update_add_multiple_labels.json similarity index 92% rename from zerver/webhooks/clubhouse/fixtures/story_update_add_multiple_labels.json rename to zerver/webhooks/shortcut/fixtures/story_update_add_multiple_labels.json index 6a0f0d9deb..f1d8f5c881 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_add_multiple_labels.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_add_multiple_labels.json @@ -11,7 +11,7 @@ "action":"update", "name":"An epic story!", "story_type":"feature", - "app_url":"https://app.clubhouse.io/zulip/story/23", + "app_url":"https://app.shortcut.com/zulip/story/23", "changes":{ "label_ids":{ "adds":[ diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_add_owner.json b/zerver/webhooks/shortcut/fixtures/story_update_add_owner.json similarity index 90% rename from zerver/webhooks/clubhouse/fixtures/story_update_add_owner.json rename to zerver/webhooks/shortcut/fixtures/story_update_add_owner.json index 271cd9d918..4de1674a09 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_add_owner.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_add_owner.json @@ -11,7 +11,7 @@ "action":"update", "name":"A new story by Shakespeare!", "story_type":"feature", - "app_url":"https://app.clubhouse.io/zulip/story/26", + "app_url":"https://app.shortcut.com/zulip/story/26", "changes":{ "owner_ids":{ "adds":[ diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_change_epic.json b/zerver/webhooks/shortcut/fixtures/story_update_change_epic.json similarity index 88% rename from zerver/webhooks/clubhouse/fixtures/story_update_change_epic.json rename to zerver/webhooks/shortcut/fixtures/story_update_change_epic.json index f4bc1d317e..05230a915d 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_change_epic.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_change_epic.json @@ -11,7 +11,7 @@ "action":"update", "name":"Add cool feature!", "story_type":"bug", - "app_url":"https://app.clubhouse.io/zulip/story/11", + "app_url":"https://app.shortcut.com/zulip/story/11", "changes":{ "epic_id":{ "new":17, @@ -24,7 +24,7 @@ { "id":17, "entity_type":"epic", - "name":"Clubhouse Fork" + "name":"Shortcut Fork" }, { "id":7, diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_change_estimate.json b/zerver/webhooks/shortcut/fixtures/story_update_change_estimate.json similarity index 89% rename from zerver/webhooks/clubhouse/fixtures/story_update_change_estimate.json rename to zerver/webhooks/shortcut/fixtures/story_update_change_estimate.json index 814b0a38a5..0b1613a216 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_change_estimate.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_change_estimate.json @@ -11,7 +11,7 @@ "action":"update", "name":"Add cool feature!", "story_type":"bug", - "app_url":"https://app.clubhouse.io/zulip/story/11", + "app_url":"https://app.shortcut.com/zulip/story/11", "changes":{ "estimate":{ "new":4, diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_change_project.json b/zerver/webhooks/shortcut/fixtures/story_update_change_project.json similarity index 92% rename from zerver/webhooks/clubhouse/fixtures/story_update_change_project.json rename to zerver/webhooks/shortcut/fixtures/story_update_change_project.json index 95848bb3d8..b4b3437076 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_change_project.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_change_project.json @@ -11,7 +11,7 @@ "action":"update", "name":"Add cool feature!", "story_type":"bug", - "app_url":"https://app.clubhouse.io/zulip/story/11", + "app_url":"https://app.shortcut.com/zulip/story/11", "changes":{ "project_id":{ "new":16, diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_change_state.json b/zerver/webhooks/shortcut/fixtures/story_update_change_state.json similarity index 95% rename from zerver/webhooks/clubhouse/fixtures/story_update_change_state.json rename to zerver/webhooks/shortcut/fixtures/story_update_change_state.json index 70cb75b5ef..77a457607c 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_change_state.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_change_state.json @@ -11,7 +11,7 @@ "action":"update", "name":"Add cool feature!", "story_type":"bug", - "app_url":"https://app.clubhouse.io/zulip/story/11", + "app_url":"https://app.shortcut.com/zulip/story/11", "changes":{ "started":{ "new":true, diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_change_title.json b/zerver/webhooks/shortcut/fixtures/story_update_change_title.json similarity index 90% rename from zerver/webhooks/clubhouse/fixtures/story_update_change_title.json rename to zerver/webhooks/shortcut/fixtures/story_update_change_title.json index 0f66ede68f..f90ef385cf 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_change_title.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_change_title.json @@ -11,7 +11,7 @@ "action":"update", "name":"Add super cool feature!", "story_type":"bug", - "app_url":"https://app.clubhouse.io/zulip/story/11", + "app_url":"https://app.shortcut.com/zulip/story/11", "changes":{ "name":{ "new":"Add super cool feature!", diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_change_type.json b/zerver/webhooks/shortcut/fixtures/story_update_change_type.json similarity index 89% rename from zerver/webhooks/clubhouse/fixtures/story_update_change_type.json rename to zerver/webhooks/shortcut/fixtures/story_update_change_type.json index dc8d065c2e..678e3ea5ce 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_change_type.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_change_type.json @@ -11,7 +11,7 @@ "action":"update", "name":"Add cool feature!", "story_type":"bug", - "app_url":"https://app.clubhouse.io/zulip/story/11", + "app_url":"https://app.shortcut.com/zulip/story/11", "changes":{ "story_type":{ "new":"bug", diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_description.json b/zerver/webhooks/shortcut/fixtures/story_update_description.json similarity index 90% rename from zerver/webhooks/clubhouse/fixtures/story_update_description.json rename to zerver/webhooks/shortcut/fixtures/story_update_description.json index eeadac728c..dc6b95fa52 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_description.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_description.json @@ -11,7 +11,7 @@ "action":"update", "name":"Add cool feature!", "story_type":"bug", - "app_url":"https://app.clubhouse.io/zulip/story/11", + "app_url":"https://app.shortcut.com/zulip/story/11", "changes":{ "description":{ "new":"We should probably add this cool feature! Just edited this. :)", diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_everything_at_once.json b/zerver/webhooks/shortcut/fixtures/story_update_everything_at_once.json similarity index 91% rename from zerver/webhooks/clubhouse/fixtures/story_update_everything_at_once.json rename to zerver/webhooks/shortcut/fixtures/story_update_everything_at_once.json index 8aeb68bbef..cfc8187cf8 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_everything_at_once.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_everything_at_once.json @@ -10,7 +10,7 @@ "action": "update", "name": "asd4", "story_type": "bug", - "app_url": "https://app.clubhouse.io/pig208/story/17", + "app_url": "https://app.shortcut.com/pig208/story/17", "changes": { "story_type": { "new": "bug", @@ -67,7 +67,7 @@ "action": "update", "name": "new1", "story_type": "bug", - "app_url": "https://app.clubhouse.io/pig208/story/26", + "app_url": "https://app.shortcut.com/pig208/story/26", "changes": { "story_type": { "new": "bug", @@ -124,7 +124,7 @@ "action": "update", "name": "new2", "story_type": "bug", - "app_url": "https://app.clubhouse.io/pig208/story/27", + "app_url": "https://app.shortcut.com/pig208/story/27", "changes": { "story_type": { "new": "bug", @@ -198,19 +198,19 @@ "id": 8, "entity_type": "label", "name": "low priority", - "app_url": "https://app.clubhouse.io/pig208/label/8" + "app_url": "https://app.shortcut.com/pig208/label/8" }, { "id": 23, "entity_type": "epic", "name": "testeipc", - "app_url": "https://app.clubhouse.io/pig208/epic/23" + "app_url": "https://app.shortcut.com/pig208/epic/23" }, { "id": 2, "entity_type": "project", "name": "Product Development", - "app_url": "https://app.clubhouse.io/pig208/project/2" + "app_url": "https://app.shortcut.com/pig208/project/2" }, { "id": "6071adb0-641f-46c4-b5e1-4945dae399ea", @@ -221,13 +221,13 @@ "id": 29, "entity_type": "epic", "name": "epic", - "app_url": "https://app.clubhouse.io/pig208/epic/29" + "app_url": "https://app.shortcut.com/pig208/epic/29" }, { "id": 28, "entity_type": "project", "name": "test2", - "app_url": "https://app.clubhouse.io/pig208/project/28" + "app_url": "https://app.shortcut.com/pig208/project/28" } ] } diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_everything_at_once_skip_removed_labels.json b/zerver/webhooks/shortcut/fixtures/story_update_everything_at_once_skip_removed_labels.json similarity index 91% rename from zerver/webhooks/clubhouse/fixtures/story_update_everything_at_once_skip_removed_labels.json rename to zerver/webhooks/shortcut/fixtures/story_update_everything_at_once_skip_removed_labels.json index 7776fd40d9..61030ae2cf 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_everything_at_once_skip_removed_labels.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_everything_at_once_skip_removed_labels.json @@ -10,7 +10,7 @@ "action": "update", "name": "asd4", "story_type": "bug", - "app_url": "https://app.clubhouse.io/pig208/story/17", + "app_url": "https://app.shortcut.com/pig208/story/17", "changes": { "story_type": { "new": "bug", @@ -67,7 +67,7 @@ "action": "update", "name": "new1", "story_type": "bug", - "app_url": "https://app.clubhouse.io/pig208/story/26", + "app_url": "https://app.shortcut.com/pig208/story/26", "changes": { "story_type": { "new": "bug", @@ -124,7 +124,7 @@ "action": "update", "name": "new2", "story_type": "bug", - "app_url": "https://app.clubhouse.io/pig208/story/27", + "app_url": "https://app.shortcut.com/pig208/story/27", "changes": { "story_type": { "new": "bug", @@ -198,19 +198,19 @@ "id": 8, "entity_type": "label", "name": "low priority", - "app_url": "https://app.clubhouse.io/pig208/label/8" + "app_url": "https://app.shortcut.com/pig208/label/8" }, { "id": 23, "entity_type": "epic", "name": "testeipc", - "app_url": "https://app.clubhouse.io/pig208/epic/23" + "app_url": "https://app.shortcut.com/pig208/epic/23" }, { "id": 2, "entity_type": "project", "name": "Product Development", - "app_url": "https://app.clubhouse.io/pig208/project/2" + "app_url": "https://app.shortcut.com/pig208/project/2" }, { "id": "6071adb0-641f-46c4-b5e1-4945dae399ea", @@ -221,13 +221,13 @@ "id": 29, "entity_type": "epic", "name": "epic", - "app_url": "https://app.clubhouse.io/pig208/epic/29" + "app_url": "https://app.shortcut.com/pig208/epic/29" }, { "id": 28, "entity_type": "project", "name": "test2", - "app_url": "https://app.clubhouse.io/pig208/project/28" + "app_url": "https://app.shortcut.com/pig208/project/28" } ] } diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_multiple_at_once.json b/zerver/webhooks/shortcut/fixtures/story_update_multiple_at_once.json similarity index 79% rename from zerver/webhooks/clubhouse/fixtures/story_update_multiple_at_once.json rename to zerver/webhooks/shortcut/fixtures/story_update_multiple_at_once.json index 78657249f8..12f8bc5294 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_multiple_at_once.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_multiple_at_once.json @@ -10,7 +10,7 @@ "action": "update", "name": "asd4", "story_type": "bug", - "app_url": "https://app.clubhouse.io/pig208/story/17", + "app_url": "https://app.shortcut.com/pig208/story/17", "changes": { "story_type": { "new": "bug", @@ -24,7 +24,7 @@ "action": "update", "name": "new1", "story_type": "bug", - "app_url": "https://app.clubhouse.io/pig208/story/26", + "app_url": "https://app.shortcut.com/pig208/story/26", "changes": { "epic_id": { "new": 23, @@ -38,7 +38,7 @@ "action": "update", "name": "new2", "story_type": "bug", - "app_url": "https://app.clubhouse.io/pig208/story/27", + "app_url": "https://app.shortcut.com/pig208/story/27", "changes": { "label_ids": { "adds": [ @@ -53,7 +53,7 @@ "action": "update", "name": "new3", "story_type": "bug", - "app_url": "https://app.clubhouse.io/pig208/story/28", + "app_url": "https://app.shortcut.com/pig208/story/28", "changes": { "workflow_state_id": { "new": 500000010, @@ -67,7 +67,7 @@ "action": "update", "name": "new4", "story_type": "bug", - "app_url": "https://app.clubhouse.io/pig208/story/29", + "app_url": "https://app.shortcut.com/pig208/story/29", "changes": { "project_id": { "new": 28, @@ -98,19 +98,19 @@ "id": 8, "entity_type": "label", "name": "low priority", - "app_url": "https://app.clubhouse.io/pig208/label/8" + "app_url": "https://app.shortcut.com/pig208/label/8" }, { "id": 23, "entity_type": "epic", "name": "testeipc", - "app_url": "https://app.clubhouse.io/pig208/epic/23" + "app_url": "https://app.shortcut.com/pig208/epic/23" }, { "id": 2, "entity_type": "project", "name": "Product Development", - "app_url": "https://app.clubhouse.io/pig208/project/2" + "app_url": "https://app.shortcut.com/pig208/project/2" }, { "id": "6071adb0-641f-46c4-b5e1-4945dae399ea", @@ -121,13 +121,13 @@ "id": 29, "entity_type": "epic", "name": "epic", - "app_url": "https://app.clubhouse.io/pig208/epic/29" + "app_url": "https://app.shortcut.com/pig208/epic/29" }, { "id": 28, "entity_type": "project", "name": "test2", - "app_url": "https://app.clubhouse.io/pig208/project/28" + "app_url": "https://app.shortcut.com/pig208/project/28" } ] } diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_multiple_not_supported.json b/zerver/webhooks/shortcut/fixtures/story_update_multiple_not_supported.json similarity index 84% rename from zerver/webhooks/clubhouse/fixtures/story_update_multiple_not_supported.json rename to zerver/webhooks/shortcut/fixtures/story_update_multiple_not_supported.json index 0b543e3857..05e37214f8 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_multiple_not_supported.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_multiple_not_supported.json @@ -10,7 +10,7 @@ "action": "update", "name": "asd4", "story_type": "bug", - "app_url": "https://app.clubhouse.io/pig208/story/17", + "app_url": "https://app.shortcut.com/pig208/story/17", "changes": { "deadline": { "new": "2021-04-12T16:00:00Z", @@ -24,7 +24,7 @@ "action": "update", "name": "new1", "story_type": "bug", - "app_url": "https://app.clubhouse.io/pig208/story/26", + "app_url": "https://app.shortcut.com/pig208/story/26", "changes": { "owner_ids": { "adds": [ @@ -39,7 +39,7 @@ "action": "update", "name": "new2", "story_type": "bug", - "app_url": "https://app.clubhouse.io/pig208/story/27", + "app_url": "https://app.shortcut.com/pig208/story/27", "changes": { "follower_ids": { "adds": [ diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_remove_attachment.json b/zerver/webhooks/shortcut/fixtures/story_update_remove_attachment.json similarity index 91% rename from zerver/webhooks/clubhouse/fixtures/story_update_remove_attachment.json rename to zerver/webhooks/shortcut/fixtures/story_update_remove_attachment.json index 06650ee93a..b8efae6b19 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_remove_attachment.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_remove_attachment.json @@ -11,7 +11,7 @@ "action":"update", "name":"Add cool feature!", "story_type":"bug", - "app_url":"https://app.clubhouse.io/zulip/story/11", + "app_url":"https://app.shortcut.com/zulip/story/11", "changes":{ "file_ids":{ "removes":[ diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_remove_description.json b/zerver/webhooks/shortcut/fixtures/story_update_remove_description.json similarity index 90% rename from zerver/webhooks/clubhouse/fixtures/story_update_remove_description.json rename to zerver/webhooks/shortcut/fixtures/story_update_remove_description.json index be05824400..eeabf3c4d1 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_remove_description.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_remove_description.json @@ -11,7 +11,7 @@ "action":"update", "name":"Add cool feature!", "story_type":"bug", - "app_url":"https://app.clubhouse.io/zulip/story/11", + "app_url":"https://app.shortcut.com/zulip/story/11", "changes":{ "description":{ "new":"", diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_remove_epic.json b/zerver/webhooks/shortcut/fixtures/story_update_remove_epic.json similarity index 90% rename from zerver/webhooks/clubhouse/fixtures/story_update_remove_epic.json rename to zerver/webhooks/shortcut/fixtures/story_update_remove_epic.json index 89e839fde7..eab51a4af0 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_remove_epic.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_remove_epic.json @@ -11,7 +11,7 @@ "action":"update", "name":"Add cool feature!", "story_type":"bug", - "app_url":"https://app.clubhouse.io/zulip/story/11", + "app_url":"https://app.shortcut.com/zulip/story/11", "changes":{ "epic_id":{ "old":7 diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_remove_estimate.json b/zerver/webhooks/shortcut/fixtures/story_update_remove_estimate.json similarity index 88% rename from zerver/webhooks/clubhouse/fixtures/story_update_remove_estimate.json rename to zerver/webhooks/shortcut/fixtures/story_update_remove_estimate.json index 219b76c009..4f60129680 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_remove_estimate.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_remove_estimate.json @@ -11,7 +11,7 @@ "action":"update", "name":"Add cool feature!", "story_type":"bug", - "app_url":"https://app.clubhouse.io/zulip/story/11", + "app_url":"https://app.shortcut.com/zulip/story/11", "changes":{ "estimate":{ "old":4 diff --git a/zerver/webhooks/clubhouse/fixtures/story_update_remove_label.json b/zerver/webhooks/shortcut/fixtures/story_update_remove_label.json similarity index 91% rename from zerver/webhooks/clubhouse/fixtures/story_update_remove_label.json rename to zerver/webhooks/shortcut/fixtures/story_update_remove_label.json index 7bbe7d26d2..a8efc16cd0 100644 --- a/zerver/webhooks/clubhouse/fixtures/story_update_remove_label.json +++ b/zerver/webhooks/shortcut/fixtures/story_update_remove_label.json @@ -11,7 +11,7 @@ "action":"update", "name":"An epic story!", "story_type":"feature", - "app_url":"https://app.clubhouse.io/zulip/story/23", + "app_url":"https://app.shortcut.com/zulip/story/23", "changes":{ "label_ids":{ "removes":[ diff --git a/zerver/webhooks/clubhouse/tests.py b/zerver/webhooks/shortcut/tests.py similarity index 81% rename from zerver/webhooks/clubhouse/tests.py rename to zerver/webhooks/shortcut/tests.py index a4fcae2563..000db9758a 100644 --- a/zerver/webhooks/clubhouse/tests.py +++ b/zerver/webhooks/shortcut/tests.py @@ -4,13 +4,14 @@ from unittest.mock import MagicMock, call, patch from zerver.lib.test_classes import WebhookTestCase -class ClubhouseWebhookTest(WebhookTestCase): - CHANNEL_NAME = "clubhouse" - URL_TEMPLATE = "/api/v1/external/clubhouse?stream={stream}&api_key={api_key}" - WEBHOOK_DIR_NAME = "clubhouse" +class ShortcutWebhookTest(WebhookTestCase): + CHANNEL_NAME = "shortcut" + URL_TEMPLATE = "/api/v1/external/shortcut?stream={stream}&api_key={api_key}" + LEGACY_URL_TEMPLATES = ["/api/v1/external/clubhouse?stream={stream}&api_key={api_key}"] + WEBHOOK_DIR_NAME = "shortcut" def test_story_create(self) -> None: - expected_message = "New story [Add cool feature!](https://app.clubhouse.io/zulip/story/11) of type **feature** was created." + expected_message = "New story [Add cool feature!](https://app.shortcut.com/zulip/story/11) of type **feature** was created." self.check_webhook( "story_create", "Add cool feature!", @@ -22,7 +23,7 @@ class ClubhouseWebhookTest(WebhookTestCase): self.check_webhook("story_delete", "New random story", expected_message) def test_epic_story_create(self) -> None: - expected_message = "New story [An epic story!](https://app.clubhouse.io/zulip/story/23) was created and added to the epic **New Cool Epic!**." + expected_message = "New story [An epic story!](https://app.shortcut.com/zulip/story/23) was created and added to the epic **New Cool Epic!**." self.check_webhook( "epic_create_story", "An epic story!", @@ -30,12 +31,12 @@ class ClubhouseWebhookTest(WebhookTestCase): ) def test_epic_delete(self) -> None: - expected_message = "The epic **Clubhouse Fork** was deleted." - self.check_webhook("epic_delete", "Clubhouse Fork", expected_message) + expected_message = "The epic **Shortcut Fork** was deleted." + self.check_webhook("epic_delete", "Shortcut Fork", expected_message) def test_story_archive(self) -> None: expected_message = ( - "The story [Story 2](https://app.clubhouse.io/zulip/story/9) was archived." + "The story [Story 2](https://app.shortcut.com/zulip/story/9) was archived." ) self.check_webhook("story_archive", "Story 2", expected_message) @@ -45,7 +46,7 @@ class ClubhouseWebhookTest(WebhookTestCase): def test_story_unarchive(self) -> None: expected_message = ( - "The story [Story 2](https://app.clubhouse.io/zulip/story/9) was unarchived." + "The story [Story 2](https://app.shortcut.com/zulip/story/9) was unarchived." ) self.check_webhook("story_unarchive", "Story 2", expected_message) @@ -58,7 +59,7 @@ class ClubhouseWebhookTest(WebhookTestCase): self.check_webhook("epic_update_add_comment", "New Cool Epic!", expected_message) def test_story_update_add_comment(self) -> None: - expected_message = "New comment added to the story [Add cool feature!](https://app.clubhouse.io/zulip/story/11):\n``` quote\nJust leaving a comment here!\n```" + expected_message = "New comment added to the story [Add cool feature!](https://app.shortcut.com/zulip/story/11):\n``` quote\nJust leaving a comment here!\n```" self.check_webhook("story_update_add_comment", "Add cool feature!", expected_message) def test_epic_update_add_description(self) -> None: @@ -74,15 +75,15 @@ class ClubhouseWebhookTest(WebhookTestCase): self.check_webhook("epic_update_change_description", "New Cool Epic!", expected_message) def test_story_update_add_description(self) -> None: - expected_message = "New description added to the story [Story 2](https://app.clubhouse.io/zulip/story/9):\n``` quote\nAdded a description.\n```" + expected_message = "New description added to the story [Story 2](https://app.shortcut.com/zulip/story/9):\n``` quote\nAdded a description.\n```" self.check_webhook("story_update_add_description", "Story 2", expected_message) def test_story_update_remove_description(self) -> None: - expected_message = "Description for the story [Add cool feature!](https://app.clubhouse.io/zulip/story/11) was removed." + expected_message = "Description for the story [Add cool feature!](https://app.shortcut.com/zulip/story/11) was removed." self.check_webhook("story_update_remove_description", "Add cool feature!", expected_message) def test_story_update_change_description(self) -> None: - expected_message = "Description for the story [Add cool feature!](https://app.clubhouse.io/zulip/story/11) was changed from:\n``` quote\nWe should probably add this cool feature!\n```\nto\n``` quote\nWe should probably add this cool feature! Just edited this. :)\n```" + expected_message = "Description for the story [Add cool feature!](https://app.shortcut.com/zulip/story/11) was changed from:\n``` quote\nWe should probably add this cool feature!\n```\nto\n``` quote\nWe should probably add this cool feature! Just edited this. :)\n```" self.check_webhook("story_update_description", "Add cool feature!", expected_message) def test_epic_update_change_state(self) -> None: @@ -92,7 +93,7 @@ class ClubhouseWebhookTest(WebhookTestCase): self.check_webhook("epic_update_change_state", "New Cool Epic!", expected_message) def test_story_update_change_state(self) -> None: - expected_message = "State of the story [Add cool feature!](https://app.clubhouse.io/zulip/story/11) was changed from **Unscheduled** to **Ready for Review**." + expected_message = "State of the story [Add cool feature!](https://app.shortcut.com/zulip/story/11) was changed from **Unscheduled** to **Ready for Review**." self.check_webhook("story_update_change_state", "Add cool feature!", expected_message) def test_epic_update_change_name(self) -> None: @@ -100,28 +101,28 @@ class ClubhouseWebhookTest(WebhookTestCase): self.check_webhook("epic_update_change_title", "New Cool Epic!", expected_message) def test_story_update_change_name(self) -> None: - expected_message = "The name of the story [Add super cool feature!](https://app.clubhouse.io/zulip/story/11) was changed from:\n``` quote\nAdd cool feature!\n```\nto\n``` quote\nAdd super cool feature!\n```" + expected_message = "The name of the story [Add super cool feature!](https://app.shortcut.com/zulip/story/11) was changed from:\n``` quote\nAdd cool feature!\n```\nto\n``` quote\nAdd super cool feature!\n```" self.check_webhook("story_update_change_title", "Add super cool feature!", expected_message) def test_story_update_add_owner(self) -> None: - expected_message = "New owner added to the story [A new story by Shakespeare!](https://app.clubhouse.io/zulip/story/26)." + expected_message = "New owner added to the story [A new story by Shakespeare!](https://app.shortcut.com/zulip/story/26)." self.check_webhook( "story_update_add_owner", "A new story by Shakespeare!", expected_message ) def test_story_task_created(self) -> None: - expected_message = "Task **Added a new task** was added to the story [Add cool feature!](https://app.clubhouse.io/zulip/story/11)." + expected_message = "Task **Added a new task** was added to the story [Add cool feature!](https://app.shortcut.com/zulip/story/11)." self.check_webhook("story_task_create", "Add cool feature!", expected_message) def test_story_task_deleted(self) -> None: - expected_message = "Task **Added a new task** was removed from the story [Add cool feature!](https://app.clubhouse.io/zulip/story/11)." + expected_message = "Task **Added a new task** was removed from the story [Add cool feature!](https://app.shortcut.com/zulip/story/11)." self.check_webhook("story_task_delete", "Add cool feature!", expected_message) def test_story_task_completed(self) -> None: - expected_message = "Task **A new task for this story** ([Add cool feature!](https://app.clubhouse.io/zulip/story/11)) was completed. :tada:" + expected_message = "Task **A new task for this story** ([Add cool feature!](https://app.shortcut.com/zulip/story/11)) was completed. :tada:" self.check_webhook("story_task_complete", "Add cool feature!", expected_message) - @patch("zerver.webhooks.clubhouse.view.check_send_webhook_message") + @patch("zerver.webhooks.shortcut.view.check_send_webhook_message") def test_story_task_incomplete_ignore(self, check_send_webhook_message_mock: MagicMock) -> None: payload = self.get_body("story_task_not_complete") result = self.client_post(self.url, payload, content_type="application/json") @@ -130,36 +131,36 @@ class ClubhouseWebhookTest(WebhookTestCase): def test_story_epic_changed(self) -> None: expected_message = ( - "The story [Add cool feature!](https://app.clubhouse.io/zulip/story/11) was moved from **Release 1.9**" - " to **Clubhouse Fork**." + "The story [Add cool feature!](https://app.shortcut.com/zulip/story/11) was moved from **Release 1.9**" + " to **Shortcut Fork**." ) self.check_webhook("story_update_change_epic", "Add cool feature!", expected_message) def test_story_epic_added(self) -> None: - expected_message = "The story [Add cool feature!](https://app.clubhouse.io/zulip/story/11) was added to the epic **Release 1.9**." + expected_message = "The story [Add cool feature!](https://app.shortcut.com/zulip/story/11) was added to the epic **Release 1.9**." self.check_webhook("story_update_add_epic", "Add cool feature!", expected_message) def test_story_epic_removed(self) -> None: - expected_message = "The story [Add cool feature!](https://app.clubhouse.io/zulip/story/11) was removed from the epic **Release 1.9**." + expected_message = "The story [Add cool feature!](https://app.shortcut.com/zulip/story/11) was removed from the epic **Release 1.9**." self.check_webhook("story_update_remove_epic", "Add cool feature!", expected_message) def test_story_estimate_changed(self) -> None: - expected_message = "The estimate for the story [Add cool feature!](https://app.clubhouse.io/zulip/story/11) was set to 4 points." + expected_message = "The estimate for the story [Add cool feature!](https://app.shortcut.com/zulip/story/11) was set to 4 points." self.check_webhook("story_update_change_estimate", "Add cool feature!", expected_message) def test_story_estimate_added(self) -> None: - expected_message = "The estimate for the story [Add cool feature!](https://app.clubhouse.io/zulip/story/11) was set to 4 points." + expected_message = "The estimate for the story [Add cool feature!](https://app.shortcut.com/zulip/story/11) was set to 4 points." self.check_webhook("story_update_add_estimate", "Add cool feature!", expected_message) def test_story_estimate_removed(self) -> None: - expected_message = "The estimate for the story [Add cool feature!](https://app.clubhouse.io/zulip/story/11) was set to *Unestimated*." + expected_message = "The estimate for the story [Add cool feature!](https://app.shortcut.com/zulip/story/11) was set to *Unestimated*." self.check_webhook("story_update_remove_estimate", "Add cool feature!", expected_message) def test_story_file_attachment_added(self) -> None: - expected_message = "A file attachment `zuliprc` was added to the story [Add cool feature!](https://app.clubhouse.io/zulip/story/11)." + expected_message = "A file attachment `zuliprc` was added to the story [Add cool feature!](https://app.shortcut.com/zulip/story/11)." self.check_webhook("story_update_add_attachment", "Add cool feature!", expected_message) - @patch("zerver.webhooks.clubhouse.view.check_send_webhook_message") + @patch("zerver.webhooks.shortcut.view.check_send_webhook_message") def test_story_file_attachment_removed_ignore( self, check_send_webhook_message_mock: MagicMock ) -> None: @@ -169,20 +170,20 @@ class ClubhouseWebhookTest(WebhookTestCase): self.assert_json_success(result) def test_story_label_added(self) -> None: - expected_message = "The label **mockup** was added to the story [An epic story!](https://app.clubhouse.io/zulip/story/23)." + expected_message = "The label **mockup** was added to the story [An epic story!](https://app.shortcut.com/zulip/story/23)." self.check_webhook("story_update_add_label", "An epic story!", expected_message) def test_story_label_multiple_added(self) -> None: - expected_message = "The labels **mockup**, **label** were added to the story [An epic story!](https://app.clubhouse.io/zulip/story/23)." + expected_message = "The labels **mockup**, **label** were added to the story [An epic story!](https://app.shortcut.com/zulip/story/23)." self.check_webhook("story_update_add_multiple_labels", "An epic story!", expected_message) def test_story_label_added_label_name_in_actions(self) -> None: - expected_message = "The label **sad** was added to the story [An emotional story!](https://app.clubhouse.io/zulip/story/28)." + expected_message = "The label **sad** was added to the story [An emotional story!](https://app.shortcut.com/zulip/story/28)." self.check_webhook( "story_update_add_label_name_in_action", "An emotional story!", expected_message ) - @patch("zerver.webhooks.clubhouse.view.check_send_webhook_message") + @patch("zerver.webhooks.shortcut.view.check_send_webhook_message") def test_story_label_removed_ignore(self, check_send_webhook_message_mock: MagicMock) -> None: payload = self.get_body("story_update_remove_label") result = self.client_post(self.url, payload, content_type="application/json") @@ -190,15 +191,15 @@ class ClubhouseWebhookTest(WebhookTestCase): self.assert_json_success(result) def test_story_update_project(self) -> None: - expected_message = "The story [Add cool feature!](https://app.clubhouse.io/zulip/story/11) was moved from the **Backend** project to **Devops**." + expected_message = "The story [Add cool feature!](https://app.shortcut.com/zulip/story/11) was moved from the **Backend** project to **Devops**." self.check_webhook("story_update_change_project", "Add cool feature!", expected_message) def test_story_update_type(self) -> None: - expected_message = "The type of the story [Add cool feature!](https://app.clubhouse.io/zulip/story/11) was changed from **feature** to **bug**." + expected_message = "The type of the story [Add cool feature!](https://app.shortcut.com/zulip/story/11) was changed from **feature** to **bug**." self.check_webhook("story_update_change_type", "Add cool feature!", expected_message) def test_story_update_add_github_pull_request(self) -> None: - expected_message = "New GitHub PR [#10](https://github.com/eeshangarg/Scheduler/pull/10) opened for story [Testing pull requests with Story](https://app.clubhouse.io/zulip/story/28) (Unscheduled -> Ready for Review)." + expected_message = "New GitHub PR [#10](https://github.com/eeshangarg/Scheduler/pull/10) opened for story [Testing pull requests with Story](https://app.shortcut.com/zulip/story/28) (Unscheduled -> Ready for Review)." self.check_webhook( "story_update_add_github_pull_request", "Testing pull requests with Story", @@ -206,14 +207,14 @@ class ClubhouseWebhookTest(WebhookTestCase): ) def test_story_update_add_github_pull_request_without_workflow_state(self) -> None: - expected_message = "New GitHub PR [#10](https://github.com/eeshangarg/Scheduler/pull/10) opened for story [Testing pull requests with Story](https://app.clubhouse.io/zulip/story/28)." + expected_message = "New GitHub PR [#10](https://github.com/eeshangarg/Scheduler/pull/10) opened for story [Testing pull requests with Story](https://app.shortcut.com/zulip/story/28)." self.check_webhook( "story_update_add_github_pull_request_without_workflow_state", "Testing pull requests with Story", expected_message, ) - @patch("zerver.webhooks.clubhouse.view.check_send_webhook_message") + @patch("zerver.webhooks.shortcut.view.check_send_webhook_message") def test_story_update_add_github_multiple_pull_requests( self, check_send_webhook_message_mock: MagicMock ) -> None: @@ -230,7 +231,7 @@ class ClubhouseWebhookTest(WebhookTestCase): user_profile, "Story1", expected_message.format( - name="Story1", url="https://app.clubhouse.io/pig208/story/17" + name="Story1", url="https://app.shortcut.com/pig208/story/17" ), "pull-request_create", ), @@ -239,7 +240,7 @@ class ClubhouseWebhookTest(WebhookTestCase): user_profile, "Story2", expected_message.format( - name="Story2", url="https://app.clubhouse.io/pig208/story/18" + name="Story2", url="https://app.shortcut.com/pig208/story/18" ), "pull-request_create", ), @@ -247,14 +248,14 @@ class ClubhouseWebhookTest(WebhookTestCase): self.assertEqual(check_send_webhook_message_mock.call_args_list, expected_list) def test_story_update_add_github_pull_request_with_comment(self) -> None: - expected_message = "Existing GitHub PR [#2](https://github.com/PIG208/test-clubhouse/pull/2) associated with story [asd2](https://app.clubhouse.io/pig208/story/15)." + expected_message = "Existing GitHub PR [#2](https://github.com/PIG208/test-clubhouse/pull/2) associated with story [asd2](https://app.shortcut.com/pig208/story/15)." self.check_webhook( "story_update_add_github_pull_request_with_comment", "asd2", expected_message, ) - @patch("zerver.webhooks.clubhouse.view.check_send_webhook_message") + @patch("zerver.webhooks.shortcut.view.check_send_webhook_message") def test_story_update_add_github_multiple_pull_requests_with_comment( self, check_send_webhook_message_mock: MagicMock ) -> None: @@ -271,7 +272,7 @@ class ClubhouseWebhookTest(WebhookTestCase): user_profile, "new1", expected_message.format( - name="new1", url="https://app.clubhouse.io/pig208/story/26" + name="new1", url="https://app.shortcut.com/pig208/story/26" ), "pull-request_comment", ), @@ -280,7 +281,7 @@ class ClubhouseWebhookTest(WebhookTestCase): user_profile, "new2", expected_message.format( - name="new2", url="https://app.clubhouse.io/pig208/story/27" + name="new2", url="https://app.shortcut.com/pig208/story/27" ), "pull-request_comment", ), @@ -288,12 +289,12 @@ class ClubhouseWebhookTest(WebhookTestCase): self.assertEqual(check_send_webhook_message_mock.call_args_list, expected_list) def test_story_update_add_github_branch(self) -> None: - expected_message = "New GitHub branch [eeshangarg/ch27/testing-pull-requests-with-story](https://github.com/eeshangarg/scheduler/tree/eeshangarg/ch27/testing-pull-requests-with-story) associated with story [Testing pull requests with Story](https://app.clubhouse.io/zulip/story/27) (Unscheduled -> In Development)." + expected_message = "New GitHub branch [eeshangarg/ch27/testing-pull-requests-with-story](https://github.com/eeshangarg/scheduler/tree/eeshangarg/ch27/testing-pull-requests-with-story) associated with story [Testing pull requests with Story](https://app.shortcut.com/zulip/story/27) (Unscheduled -> In Development)." self.check_webhook( "story_update_add_github_branch", "Testing pull requests with Story", expected_message ) - @patch("zerver.webhooks.clubhouse.view.check_send_webhook_message") + @patch("zerver.webhooks.shortcut.view.check_send_webhook_message") def test_story_update_batch(self, check_send_webhook_message_mock: MagicMock) -> None: payload = self.get_body("story_update_everything_at_once") self.client_post(self.url, payload, content_type="application/json") @@ -308,7 +309,7 @@ class ClubhouseWebhookTest(WebhookTestCase): user_profile, "asd4", expected_message.format( - name="asd4", url="https://app.clubhouse.io/pig208/story/17" + name="asd4", url="https://app.shortcut.com/pig208/story/17" ), "story_update_batch", ), @@ -317,7 +318,7 @@ class ClubhouseWebhookTest(WebhookTestCase): user_profile, "new1", expected_message.format( - name="new1", url="https://app.clubhouse.io/pig208/story/26" + name="new1", url="https://app.shortcut.com/pig208/story/26" ), "story_update_batch", ), @@ -326,14 +327,14 @@ class ClubhouseWebhookTest(WebhookTestCase): user_profile, "new2", expected_message.format( - name="new2", url="https://app.clubhouse.io/pig208/story/27" + name="new2", url="https://app.shortcut.com/pig208/story/27" ), "story_update_batch", ), ] self.assertEqual(check_send_webhook_message_mock.call_args_list, expected_list) - @patch("zerver.webhooks.clubhouse.view.check_send_webhook_message") + @patch("zerver.webhooks.shortcut.view.check_send_webhook_message") def test_story_update_batch_skip_removed_labels( self, check_send_webhook_message_mock: MagicMock ) -> None: @@ -350,7 +351,7 @@ class ClubhouseWebhookTest(WebhookTestCase): user_profile, "asd4", expected_message.format( - name="asd4", url="https://app.clubhouse.io/pig208/story/17" + name="asd4", url="https://app.shortcut.com/pig208/story/17" ), "story_update_batch", ), @@ -359,7 +360,7 @@ class ClubhouseWebhookTest(WebhookTestCase): user_profile, "new1", expected_message.format( - name="new1", url="https://app.clubhouse.io/pig208/story/26" + name="new1", url="https://app.shortcut.com/pig208/story/26" ), "story_update_batch", ), @@ -368,14 +369,14 @@ class ClubhouseWebhookTest(WebhookTestCase): user_profile, "new2", expected_message.format( - name="new2", url="https://app.clubhouse.io/pig208/story/27" + name="new2", url="https://app.shortcut.com/pig208/story/27" ), "story_update_batch", ), ] self.assertEqual(check_send_webhook_message_mock.call_args_list, expected_list) - @patch("zerver.webhooks.clubhouse.view.check_send_webhook_message") + @patch("zerver.webhooks.shortcut.view.check_send_webhook_message") def test_story_update_batch_each_with_one_change( self, check_send_webhook_message_mock: MagicMock ) -> None: @@ -384,23 +385,23 @@ class ClubhouseWebhookTest(WebhookTestCase): expected_messages = [ ( "asd4", - "The type of the story [asd4](https://app.clubhouse.io/pig208/story/17) was changed from **feature** to **bug**.", + "The type of the story [asd4](https://app.shortcut.com/pig208/story/17) was changed from **feature** to **bug**.", ), ( "new1", - "The story [new1](https://app.clubhouse.io/pig208/story/26) was moved from **epic** to **testeipc**.", + "The story [new1](https://app.shortcut.com/pig208/story/26) was moved from **epic** to **testeipc**.", ), ( "new2", - "The label **low priority** was added to the story [new2](https://app.clubhouse.io/pig208/story/27).", + "The label **low priority** was added to the story [new2](https://app.shortcut.com/pig208/story/27).", ), ( "new3", - "State of the story [new3](https://app.clubhouse.io/pig208/story/28) was changed from **In Development** to **Ready for Review**.", + "State of the story [new3](https://app.shortcut.com/pig208/story/28) was changed from **In Development** to **Ready for Review**.", ), ( "new4", - "The story [new4](https://app.clubhouse.io/pig208/story/29) was moved from the **Product Development** project to **test2**.", + "The story [new4](https://app.shortcut.com/pig208/story/29) was moved from the **Product Development** project to **test2**.", ), ] request, user_profile = ( @@ -419,7 +420,7 @@ class ClubhouseWebhookTest(WebhookTestCase): ] self.assertEqual(check_send_webhook_message_mock.call_args_list, expected_list) - @patch("zerver.webhooks.clubhouse.view.check_send_webhook_message") + @patch("zerver.webhooks.shortcut.view.check_send_webhook_message") def test_story_update_batch_not_supported_ignore( self, check_send_webhook_message_mock: MagicMock ) -> None: @@ -428,7 +429,7 @@ class ClubhouseWebhookTest(WebhookTestCase): self.assertFalse(check_send_webhook_message_mock.called) self.assert_json_success(result) - @patch("zerver.webhooks.clubhouse.view.check_send_webhook_message") + @patch("zerver.webhooks.shortcut.view.check_send_webhook_message") def test_empty_post_request_body_ignore( self, check_send_webhook_message_mock: MagicMock ) -> None: @@ -437,7 +438,7 @@ class ClubhouseWebhookTest(WebhookTestCase): self.assertFalse(check_send_webhook_message_mock.called) self.assert_json_success(result) - @patch("zerver.webhooks.clubhouse.view.check_send_webhook_message") + @patch("zerver.webhooks.shortcut.view.check_send_webhook_message") def test_story_comment_updated_ignore(self, check_send_webhook_message_mock: MagicMock) -> None: payload = self.get_body("story_comment_updated") result = self.client_post(self.url, payload, content_type="application/json") diff --git a/zerver/webhooks/clubhouse/view.py b/zerver/webhooks/shortcut/view.py similarity index 99% rename from zerver/webhooks/clubhouse/view.py rename to zerver/webhooks/shortcut/view.py index acdb6e0d8b..4df1580b98 100644 --- a/zerver/webhooks/clubhouse/view.py +++ b/zerver/webhooks/shortcut/view.py @@ -755,15 +755,15 @@ EVENTS_SECONDARY_ACTIONS_FUNCTION_MAPPER: dict[str, Callable[[WildValue], Iterat } -@webhook_view("Clubhouse", all_event_types=ALL_EVENT_TYPES) +@webhook_view("Shortcut", all_event_types=ALL_EVENT_TYPES) @typed_endpoint -def api_clubhouse_webhook( +def api_shortcut_webhook( request: HttpRequest, user_profile: UserProfile, *, payload: JsonBodyPayload[WildValue], ) -> HttpResponse: - # Clubhouse has a tendency to send empty POST requests to + # Shortcut has a tendency to send empty POST requests to # third-party endpoints. It is unclear as to which event type # such requests correspond to. So, it is best to ignore such # requests for now.