
    xh>                        S SK r S SKrS SKJr  S SKJrJr  S SKJr  S SKJ	r	J
r
  S SKJr  S SKJrJrJrJrJr  S SKJr  S S	KJrJrJr  S S
KJr  S SKJrJr  S SKJr  S SK J!r!  S SK"J#r#J$r$J%r%  S SK&J'r'  S SK(J)r)  S SK*J+r+  S SK,J-r-  S SK.J/r/  S SK0J1r1  S SK2J3r3  SSK4J5r5J6r6  SSK7J8r8J9r9J:r:J;r;  SSK<J=r=J>r>J?r?J@r@JArA  SSKBJCrC  SSKDJErE    SPS\/S\FS-  S\FS-  4S  jjrG\" S!\5R                  5      rI " S" S#\%5      rJ\ER                  " S$\=S%S&9\1" / S'Q5      S\/S(\L4S) j5       5       rM\ER                  " S$\=S*9\1" S+S,/5      S\/S(\LS-\J4S. j5       5       rO\ER                  " S$S/S0S*9\1" S+S,/5      S\/S(\L4S0 j5       5       rQ\ER                  " S1\=S*9\1" S+S,/5      S\/S\FS(\LS-\J4S2 j5       5       rRS3\S(\LS-\J4S4 jrS\ R                  " S55      rUS6\	S7\4S8 jrV\+\\)" \V5      4   rW " S9 S:\%5      rX\
S;   rY  SPS3\S<\$\X   S=\YS-  S>\S-  4S? jjrZ\ER                  " S@\[\>   S%S&9\1" / S'Q5      \' SQS\/SA\S\FS<\$\X   S=\Y4
SB jj5       5       5       r\\ER                  " S@\JS*9\1" S+S,/5      S\/S\FS<\$\X   4SC j5       5       r]\ER                  " S@\JS*9\1" S+S,/5      S\/S\FS<\$\X   S-\J4SD j5       5       r^\ER                  " SE\[\>   S%S&9\1" / S'Q5      \' SQS\/SA\S\FS\FS<\$\X   S=\Y4SF jj5       5       5       r_\ER                  " SG\[\@   S%S&9\1" / S'Q5       SRS\/S(\LSH\FS-  4SI jj5       5       r` " SJ SK\%5      ra\ER                  " SL\[\?   SMS%SN9S\/S\FS<\$\a   4SO j5       rbg)S    N)defaultdict)datetime	timedelta)StrEnum)AnyLiteral)UUID)CountF
FloatFieldSumValue)ExpressionWrapper)ExtractLogTruncDay)QuerySet)Http404HttpResponse)aget_object_or_404)timezone)FieldQuerySchema)paginate)BeforeValidator)	Annotated)Organization)AuthHttpRequest)has_permission)async_call_celery_task   )EventStatusLogLevel)IssueIssueAggregate
IssueEvent	IssueHash)IssueDetailSchemaIssueSchemaIssueStatsResponseIssueTagSchemaStatsDetailSchema)delete_issue_task   )routerrequestorganization_slugproject_slugc                 ^  #    U R                   R                  n[        R                  nU(       a0  [	        [
        X1S9I S h  vN nUR                  UR                  S9nOUR                  US9nU(       a  UR                  US9nUR                  [        SSS9S9R                  S	5      $  Ni7f)
Nusersslug)project__organization_id)project__organization__users)project__slugcommentsTdistinct)num_commentsproject)authuser_idr%   objectsr   r   filteridannotater
   select_related)r1   r2   r3   rA   qsorganizations         %/code/apps/issue_events/api/issues.pyget_querysetrJ   '   s     
 ll""G	B/
 
 YYY@YYGY<YY\Y2;;:5  nY 
s   ?B-B+A*B-EventStatusEnumc                   >    \ rS rSr% Sr\S-  \S'   Sr\S-  \S'   Sr	g)UpdateIssueSchemaA   Nstatusmerge )
__name__
__module____qualname____firstlineno__rO   rK   __annotations__rP   int__static_attributes__rQ       rI   rM   rM   A   s    %)FOd")E3:rY   rM   z/issues/{int:issue_id}/T)responseby_alias)z
event:readevent:writeevent:adminissue_idc                    #    [        U 5      I S h  vN nUR                  [        SSS9S9n UR                  US9R	                  5       I S h  vN $  NA N! [
        R                   a    [        5       ef = f7f)N
userreportTr<   user_report_countrD   )rJ   rE   r
   rC   agetr%   DoesNotExistr   )r1   r^   rG   s      rI   	get_issuerf   F   sx      G$	$B	t< 
 
BYY(Y+00222 
%
 3 is8   A9AA9 A AA A9A A66A9)rZ   r\   r]   payloadc                 `   #    [        U 5      I S h  vN n[        X1U5      I S h  vN $  N N7fNrJ   update_issue_status)r1   r^   rg   rG   s       rI   update_issuerl   W   s,      G$	$B$R7;;; 
%;s   .*.,..   c                    #    [        U 5      I S h  vN nUR                  US9R                  SS9I S h  vN nU(       d
  [        5       e[	        [
        U/5      I S h  vN   g NS N1 N	7f)Nrc   T
is_deleted)rm   N)rJ   rC   aupdater   r!   r.   )r1   r^   rG   results       rI   delete_issuers   e   sc      G$	$B999)11T1BBFi
 !2XJ
??? 
%B @s1   A+A%#A+A')A+A) A+'A+)A+z=organizations/{slug:organization_slug}/issues/{int:issue_id}/c                 \   #    [        XS9I S h  vN n[        XBU5      I S h  vN $  N N7f)Nr2   rj   )r1   r2   r^   rg   rG   s        rI   update_organization_issuerv   p   s-      GI	IB$R7;;; 
J;s   ,(,*,,rG   c                 N  #    U R                  [        SSS9S9n  U R                  US9R                  5       I Sh  vN n[        R                  " UR                  5      Ul	        UR                  5       I Sh  vN   U$  NC! [        R
                   a    [        5       ef = f N*7f)z
BC Gitlab integration
r`   Tr<   ra   rc   N)rE   r
   rC   rd   r%   re   r   r#   from_stringrO   asave)rG   r^   rg   objs       rI   rk   rk      s      
t< 
 
BIII*//11 ((8CJ
))+J 2 i s8   B% B A?B  8B%8B#9B%?B B  B%znow\s*\-\s*\d+\s*(m|h|d)\s*$vreturnc                 `   [         R                  " 5       nU S:X  a  U$ [        R                  U 5      (       av  U R	                  SS5      n[        [        R                  " SU5      S   5      nUS   S:X  a  U[        US9-  nUS   S	:X  a  U[        US
9-  nUS   S:X  a  U[        US9-  nU$ U $ )z
Allow relative terms like now or now-1h. Only 0 or 1 subtraction operation is permitted.

Accepts
- now
- - (subtraction)
- m (minutes)
- h (hours)
- d (days)
now  z\d+r   m)minuteshhoursddays)	r   r~   RELATIVE_TIME_REGEXmatchreplacerW   refindallr   )r{   rr   spaces_strippednumberss       rI   relative_to_datetimer      s     \\^FEz  ##))C,bjj9!<=2#%i00F2#%ig..F2#%iW--FHrY   c                       \ rS rSr% \" SSS9r\\   S-  \S'   \" SSS9r	\
S-  \S'   \" SSS9r\
S-  \S	'   \" SS
S9r\\   S-  \S'   Sr\\   S-  \S'   Sr\S-  \S'   Srg)IssueFilters   NrD   )aliasid__instartfirst_seen__gteendfirst_seen__lter?   project__inenvironmentqueryrQ   )rR   rS   rT   rU   r   r   listrW   rV   r   RelativeDateTimer   r   r   strr   rX   rQ   rY   rI   r   r      s    $T6FDI6/4T/IO%,I/4T/GO%,G$)$i$@KcT!@$(KcT!(E3:rY   r   )	last_seen
first_seencountpriority
-last_seenz-first_seenz-countz	-priorityfilterssortevent_idc           
      ,   UR                  SS9nUR                  SS 5      nUR                  (       a  SUS'   UR                  S5      US'   U(       a  U R                  " S0 UD6n U(       a  U R                  US9n GOU(       Ga  [        R
                  " U5      n[        U5       H  u  puUR                  SS	5      n[        U5      S
:X  a  Uu  pU
R                  S5      n
U	S:X  a$  U R                  [        R                  " U
5      S9n OPU	S:X  a  U R                  U
S9n O:U	S:X  a$  U R                  [        R                  " U
5      S9n OU R                  U	U
S9n [        U5      S	:X  d  M  SR                  XgS  5      nU R                  US9n   O   U(       a{  UR                  S5      (       aT  U R                  [        [!        S[#        S5      5      [%        [#        S5      S5      ['        S5      -  -   [)        5       S9S9n U R+                  U5      n U $ )NT)exclude_noner   r   issuetag__tag_key__keyissuetag__tag_value__value__in)issueevent__id:r/   r"   "isrO   has)r   level)r   )r   issuetag__tag_value__valuer   )search_vectorr   
   r   r   epochg    OA)output_field)r   rQ   )dictpopr   rC   shlexsplit	enumeratelenstripr#   rx   r$   joinendswithrE   r   r   r   r   r   r   order_by)rG   r   r   r   
qs_filtersr   queriesi
query_part
query_namequery_valuesearch_querys               rI   filter_issue_listr      s    40JNN7D)E/<
+,7A~~m7T
34YY$$YYhY/	++e$!'*HAS!,J:!#*4'
)//4%+*A*A+*NOB5(/: # B  7*)=)=k)JKB/93> # B :!#"xx4YY\Y:1 +4 ==$$*AgJ'ang6xHI!+  B [[IrY   z.organizations/{slug:organization_slug}/issues/rZ   c                    #    [        XS9I S h  vN R                  SS9nS nUR                  (       a!   [        UR                  5      nX`l        SUS'   [        XSXF5      $  NQ! [
         a     Nf = f7f)Nru   Fro   1X-Sentry-Direct-Hit)rJ   rC   r   r	   matching_event_id
ValueErrorr   )r1   rZ   r2   r   r   rG   r   s          rI   list_issuesr      s      WJ
J	R	R 
S 
B !H}}	GMM*H(0%.1H*+ R$99 K  		s2   A3A!$A3 A# A3#
A0-A3/A00A3c                 $  #    [        XS9I S h  vN n[        X25      nUR                  SS9I S h  vN   UR                  SS9R	                  SSS9 Vs/ s S h  vN nUPM   NT N4 N
 Os  snf nn[        [        U5      I S h  vN    SS0$ 7f)Nru   Tro   rD   flatrO   resolved)rJ   r   rq   rC   values_listr!   r.   )r1   r2   r   rG   r^   	issue_idss         rI   delete_issuesr     s      GI	IB	2	'B
***
%%% !ii4i8DDTPTDU  		 
J% I  !!2I
>>>j!!sa   BA$!BA&#BA,A*A(
A*A,$B&B(A**A,+BB		Bc                 4  #    [        XS9I S h  vN n[        XB5      nUR                  (       a5  UR                  [        R
                  " UR                  5      S9I S h  vN   UR                  (       a  UR                  S5      R                  5       I S h  vN nU(       d  U$ UR                  UR                  S9nUR                  SS9I S h  vN   [        R                  R                  US9R                  US9I S h  vN   / n[        R                  R                  US9R                  S	SS
9S S   S h  vN nUR!                  U5        M  U$  GNG N N N N[ N$
 [        R                  R                  US9R                  US9I S h  vN    ND7f)Nru   r   z-idrc   Tro   )	issue__in)issuerD   r   i  )r   )rJ   r   rO   rq   r#   rx   rP   r   afirstexcluderD   r(   rB   rC   r'   r   append)	r1   r2   r   rg   rG   r   	remove_qs	event_idsr   s	            rI   update_issuesr   0  si     GI	IB	2	'B~~jj 7 7 GjHHH}}kk%(//11NJJ%((J+	4000&&&;CC%CPPP	(0077 8 

+d+
&u. 	'( X&N% 
J 	I1 	1P	' .   ''y'9AAANNNs   FEAF E!7FE8FE1FE4F8E#<E!=E# FFFFF!E##.FFFz=projects/{slug:organization_slug}/{slug:project_slug}/issues/c                    #    [        XUS9I S h  vN nS nUR                  (       a!   [        UR                  5      nXpl        SUS'   [        XdXW5      $  ND! [         a     Nf = f7f)N)r2   r3   r   r   )rJ   r   r	   r   r   r   )r1   rZ   r2   r3   r   r   rG   r   s           rI   list_project_issuesr   O  st      < 
B !H}}	GMM*H(0%.1H*+ R$99
  		s2   A'AA' A 	A'
A$!A'#A$$A'z/issues/{int:issue_id}/tags/keyc                   #    [        U 5      I S h  vN n UR                  US9R                  5       I S h  vN nUR                  nU(       a  UR                  US9nUR                  SS5      R                  [        S5      S9R                  S5      S S nU Vs1 s S h  vN oUS   iM   N Nw! [        R                   a    [        5       ef = f N0
 Os  snf nnU VVs/ s H  nU Vs/ s H!  nUS   U:X  d  M  US   US   US	   US   S
.PM#     Os  snf sn[        U Vs/ s H  owS   U:X  d  M  UPM     Os  snf sn5      UU[        U Vs/ s H  owS   U:X  d  M  US	   PM     Os  snf sn5      S.PM     snn$ s  snnf 7f)Nrc   )tag_key__keyr   tag_value__valuer   )total_countz-total_counti r   )namevaluer   r   )	topValuesuniqueValuesr   r   totalValues)rJ   rC   rd   r%   re   r   issuetag_setvaluesrE   r   r   r   sum)r1   r^   r   rG   r   rowkeysgroups           rI   list_issue_tagsr   l  s     G$	$Bii8i,1133 
		B
YYCY(
		."45	c'l	+	.	!'6	+ 
 2444# 
%3 i 54D4, +* C  	  E(C/!"45"#56"=1 0	  	  $&GB5*?3*FBG 35V2%~9NRU9U%}%2V!	
( +  s   F	B-F	 B1 B/B1 A F	CC"C
#C&C-F	/B1 1CF	CCF	#
F-D>DF&D=6D=<FE-#	E-,F?
F	c                   :    \ rS rSr% \\   \S'   Sr\S   \S'   Sr	g)IssueStatsFiltersi  groups24h)14dr   statsPeriodrQ   N)
rR   rS   rT   rU   r   rW   rV   r   r   rX   rQ   rY   rI   r   r     s    I).K&.rY   r   z4organizations/{slug:organization_slug}/issues-stats/z'Retrieve Statistics for a Set of Issues)rZ   summaryr[   c                 L  ^#    U R                   R                  n[        [        X1S9I Sh  vN n[        R
                  R                  UR                  UR                  S9SS nU Vs/ s Sh  vN ofPM   NK N	
 Os  snf nnU Vs/ s H  ofR                  PM     Os  snf nnU(       d  / $ UR                  S:H  n	[        [        5      mU	(       a  [        R                  " 5       [        SS9-
  n
[        R
                  R                  XS9R!                  S	S
S5      nU Vs/ s Sh  vN  oPM  
 Os  snf nnU H:  n[#        US
   R%                  5       5      nTUS	      R'                  XS   /5        M<     U4S jnO[        R                  " 5       [        SS9-
  n
[        R
                  R                  XS9R)                  [+        S
5      S9R!                  S	S5      R)                  [-        S5      S9R/                  S5      nU Vs/ s Sh  vN  oPM  
 Os  snf nnU H:  n[#        US   R%                  5       5      nTUS	      R'                  XS   /5        M<     U4S jnU Vs/ s H  n[1        [3        UR                  5      [3        UR4                  5      UR4                  UR6                  R9                  5       UR:                  R9                  5       UR<                  R?                  SS5      [A        S0 U" UR                  5      D6S9PM     sn$ s  snf 7f)z
Retrieves aggregated statistics for a given list of issue groups.

This endpoint returns data for the last 24 hours, formatted as a series of
[timestamp, count] pairs.
r5   N)r8   r      r      r   )issue_id__in	date__gter^   dater   c                 ,   > STR                  U / 5      0$ )N	stats_24hgetr^   	stats_maps    rI   get_stats_data#issue_stats.<locals>.get_stats_data      x!<==rY      r   )dayr  )daily_countr  c                 ,   > STR                  U / 5      0$ )N	stats_14dr  r  s    rI   r  r    r	  rY   	unhandledF)rD   r   
user_countr   r   is_unhandledstatsrQ   )!r@   rA   r   r   r%   rB   rC   rD   r   r   r   r   r   r~   r   r&   r   rW   	timestampr   rE   r   r   r   r+   r   r   r   	isoformatr   metadatar  r-   )r1   r2   r   rA   rH   	issues_qsr   
issue_listr   is_24h
start_datestats_qsstat
stats_listr  r  daily_stats_qsdaily_stats_listr  s                     @rI   issue_statsr    s     ll""G+G L $$!- % 
sI ,555%% 65J5'12zez2I2	  E)FD!I\\^ib&99
 "))00" 1 

&VW
- 	 .666Td66
6 DDL2245Id:&'..	=/IJ 
	>
 \\^iR&88
 ""))y)WX(6*X+VJ&X#g,X/Xe_ 	 4BBB4DBBB %DDK1134Id:&'..	;N/OP %
	>    E 	588}ekk"{{''113oo//1++K?#?nUXX&>?	
    s   (L$A7=L$)A=+A;/A9
0A;3A=7L$9A;;A=<L$BBL$$D5&D3*D-
+D3/D54CL$HHH
HHAL$0B,LL$)NN)r   ri   )cr   r   collectionsr   r   r   enumr   typingr   r   uuidr	   django.db.modelsr
   r   r   r   r   django.db.models.expressionsr   django.db.models.functionsr   r   r   django.db.models.queryr   django.httpr   r   django.shortcutsr   django.utilsr   ninjar   r   r   ninja.paginationr   pydantic.functional_validatorsr   typing_extensionsr   apps.organizations_ext.modelsr   glitchtip.api.authenticationr   glitchtip.api.permissionsr    glitchtip.utilsr!   	constantsr#   r$   modelsr%   r&   r'   r(   schemar)   r*   r+   r,   r-   tasksr.   r   r0   r   rJ   labelsrK   rM   r  rW   rf   putrl   deleters   rv   rk   compiler   r   r   r   sort_optionsr   r   r   r   r   r   r   r   r  rQ   rY   rI   <module>r<     s   	  # (    = = : = = + - / ! & & % : ' 6 8 4 2 - A A  & 
 %)#  Tz  * . +[-?-?@ 
 
 <=_   >  ./<<< < 0	
< (C;?./ 3  0 @ C ./<<< < 	< 0	
<( c DU   jj!@A C H 6 X7K'LLM 6  	 !% 	88< 8 
8 Tk	8v 4+
 <=	 &::: : < 	:
 : 
 >:* 4?P ./""" < " 0"  4?P ./ <  	 06 C+
 <=	 &::: : 	:
 < : : 
 >:, "T.-AD <=?C(((+(25*( >(V/ /
 :$%5	QQ14Q?DEV?WQQrY   