
    xh                        S SK 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K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JrJrJr  SSKJr   " S S\
R<                  5      r " S S\
R@                  5      r! " S S\
R@                  5      r" " S S\5      r# " S S\5      r$ " S S\5      r% " S S\
R@                  5      r& " S S\
R@                  5      r' " S S \5      r( " S! S"\\
R@                  5      r)g)#    N)settings)
ArrayField)GinIndex)SearchVectorField)models)timezone)PostgresPartitionedModel)PostgresPartitioningMethod)AggregationModelCreatedModelSoftDeleteModel)MAX_CULPRIT_LENGTH   )MAX_TAG_LENGTHEventStatusIssueEventTypeLogLevel)base32_encodec                   :   ^  \ rS rSr/ 4U 4S jjrU 4S jrSrU =r$ )DeferedFieldManager   c                 .   > [         TU ]  5         Xl        g N)super__init__defered_fields)selfr   	__class__s     !/code/apps/issue_events/models.pyr   DeferedFieldManager.__init__   s    ,    c                 R   > [         TU ]  " U0 UD6R                  " U R                  6 $ r   )r   get_querysetdeferr   )r   argskwargsr   s      r   r#    DeferedFieldManager.get_queryset   s)    w#T4V4::D<O<OPPr!   )r   )__name__
__module____qualname____firstlineno__r   r#   __static_attributes____classcell__)r   s   @r   r   r      s    &( -Q Qr!   r   c                   V    \ rS rSr\R
                  " SS9r\R                  " \SS9r	Sr
g)TagKey   T)primary_key
max_lengthunique N)r(   r)   r*   r+   r   	AutoFieldid	CharFieldr   keyr,   r5   r!   r   r/   r/      s$    			d	+B


nT
BCr!   r/   c                   6    \ rS rSr\R
                  " \SS9rSrg)TagValue!   Tr2   r5   N)	r(   r)   r*   r+   r   r8   r   valuer,   r5   r!   r   r;   r;   !   s    tDEr!   r;   c                      \ rS rSrSr\R                  " S\R                  S9r\R                  " \	\R                  S9r
\R                  " \\R                  S9r\R                  " SS9r " S S5      r " S	 S
\R"                  5      rSrg)IssueTag%   zp
This model is a aggregate of event tags for an issue.
It is denormalized data that powers fast search results.
Issue	on_deleter   defaultc                   <    \ rS rSr\R
                  " / SQSS9/rSrg)IssueTag.Meta0   )issuedatetag_key	tag_valueissue_tag_key_value_uniquefieldsnamer5   Nr(   r)   r*   r+   r   UniqueConstraintconstraintsr,   r5   r!   r   MetarG   0   s    ##@1
r!   rT   c                       \ rS rSrSrg)IssueTag.PartitioningMeta8   r5   Nr(   r)   r*   r+   r,   r5   r!   r   PartitioningMetarV   8       r!   rY   r5   N)r(   r)   r*   r+   __doc__r   
ForeignKeyCASCADErI   r/   rK   r;   rL   PositiveIntegerFieldcountrT   r   rY   r,   r5   r!   r   r?   r?   %   sx    
 g@E&..AG!!(fnnEI''2E
 
+<< r!   r?   c                       \ rS rSrSr\R                  " SSS5      r\R                  " S\R                  S9r
\R                  " S\R                  S9r " S	 S
\R                  5      rSrg)IssueAggregate<   z5Count the number of events for an issue per time unitrI   organizationrJ   rA   rB   zorganizations_ext.Organizationc                       \ rS rSrSrg)IssueAggregate.PartitioningMetaE   r5   NrX   r5   r!   r   rY   re   E   rZ   r!   rY   r5   N)r(   r)   r*   r+   r[   r   CompositePrimaryKeypkr\   r]   rI   rc   r   rY   r,   r5   r!   r   ra   ra   <   s[    ?		#	#G^V	DBg@E$$(FNNL+<< r!   ra   c                      \ rS rSr\R
                  " SSSS9r\R                  " SS9r\R                  " \
R                  \
R                  S9r\R                  " 5       r\R                   " S\R"                  S	S
9r\R
                  " SS9r\R                  " \R                  \R*                  S9r\R                  " \R                  \R0                  S9r\R4                  " SS9r\" SSS9r\R4                  " SSS9r\R>                  " \ RB                  SS9r"\R>                  " \ RB                  SS9r#\$" S/5      r% " S S5      r&S r'S r(S r)\*S 5       r+Sr,g)rA   I   i   T)r3   blanknullFrD   choicesrE   projects.ProjectissuesrC   related_name   r3   )rl    )editablerE   r   )rE   rv   )rE   db_indexsearch_vectorc                   P    \ rS rSrSr\R                  " SS/SS9/r\" S/S9/r	S	r
g
)
Issue.Metab   objectsprojectshort_idproject_short_id_uniquerN   rx   rO   r5   N)r(   r)   r*   r+   base_manager_namer   rR   rS   r   indexesr,   r5   r!   r   rT   rz   b   s<    %##!:..
 _-.
r!   rT   c                     U R                   $ r   )titler   s    r   __str__Issue.__str__n   s    zzr!   c                     [         R                  R                  5        SU R                  R                  R
                   SU R                   3$ )N/z/issues/)r   GLITCHTIP_URLgeturlr}   rc   slugrh   r   s    r   get_detail_urlIssue.get_detail_urlq   sC    ((//12!DLL4M4M4R4R3SS[\`\c\c[deer!   c                     U R                   [        R                  :X  a  gU R                   [        R                  L a  gU R                   [        R                  [        R
                  4;   a  gg )Nz#4b60b4z#e9b949z#e52b50)levelr   INFOWARNINGERRORFATALr   s    r   get_hex_colorIssue.get_hex_colort   sK    ::&ZZ8+++ZZHNNHNN;; <r!   c                     U R                   b<  U R                  R                  R                  5        S[	        U R                   5       3$ g)z
Short IDs are per project issue counters. They show as PROJECT_SLUG-ID_BASE32
The intention is to be human readable identifiers that can reference an issue.
-ru   )r~   r}   r   upperr   r   s    r   short_id_displayIssue.short_id_display|   s@     ==$ll''--/0-2N1OPPr!   r5   N)-r(   r)   r*   r+   r   r8   culpritBooleanField	is_publicPositiveSmallIntegerFieldr   rn   r   r   	JSONFieldmetadatar\   r]   r}   r   r   DEFAULTtyper   
UNRESOLVEDstatusr^   r~   r   rx   r_   DateTimeFieldr   now
first_seen	last_seenr   r|   rT   r   r   r   propertyr   r,   r5   r!   r   rA   rA   I   s]   $dFG##E2I,,  (..E !Hfnn8G ,E++&&0F0FD --##[-C-CF **5H%ubAM''EBE%%hllTJJ$$X\\DII!?"34G

 

f  r!   rA   c                       \ rS rSr\R
                  " \\R                  SS9r\R
                  " S\R                  SS9r	\R                  " SS9r " S S	5      rS
rg)	IssueHash   hashesrq   ro   +T)rw   c                   <    \ rS rSr\R
                  " SS/SS9/rSrg)IssueHash.Meta   r}   r=   zissue hash projectrN   r5   NrQ   r5   r!   r   rT   r      s"    ##!7+2F
r!   rT   r5   N)r(   r)   r*   r+   r   r\   rA   r]   rI   r}   	UUIDFieldr=   rT   r,   r5   r!   r   r   r      sQ    ev~~HUEfnn3G d+E
 
r!   r   c                       \ rS rSr\R
                  " SS9r\R                  " \\R                  SS9r
\R                  " SS\R                  SS9r\R                  " SSS	9r " S
 S5      rSrg)Comment   T)auto_now_addcommentsrq   z
users.Userr   )rl   rC   rr   )rk   rl   c                       \ rS rSrSrSrg)Comment.Meta   )z-createdr5   N)r(   r)   r*   r+   orderingr,   r5   r!   r   rT   r      s     r!   rT   r5   N)r(   r)   r*   r+   r   r   createdr\   rA   r]   rI   SET_NULLuser	TextFieldtextrT   r,   r5   r!   r   r   r      se    ""5Gev~~JWE46??D $T2D! !r!   r   c                      \ rS rSr\R
                  " S\R                  SS9r\R
                  " \S\R                  S9r	\R                  " 5       r\R                  " SS9r\R                  " 5       r\R                   " 5       r " S	 S
5      rSrg)
UserReport   ro   r   rq   T)rl   rC      rt   c                   <    \ rS rSr\R
                  " SS/SS9/rSrg)UserReport.Meta   r}   event_idproject_event_uniquerN   r5   NrQ   r5   r!   r   rT   r      s"    ##!:.+
r!   rT   r5   N)r(   r)   r*   r+   r   r\   r]   r}   rA   rI   r   r   r8   rP   
EmailFieldemailr   r   rT   r,   r5   r!   r   r   r      s{    fnn3G e$&..IE!Hs+DE!H
 
r!   r   c                      \ rS rSr\R
                  " S\R                  SS9r\R                  " \
\R                  S9r\R                  " S\R                  S9r\R"                  " SS	9r\R"                  " S
S	9r\R(                  " SS9r\R(                  " \S9r\R                  " \R                  \R2                  S9r\R6                  " 5       r\" \R(                  " SS9/ S9r\R6                  " 5       r\R                  " SSS\R@                  S9r! " S S5      r" " S S5      r#S r$\%S 5       r&\%S 5       r'\%S 5       r(\%S 5       r)Sr*g)
IssueEvent   TF)r1   rE   rv   rB   r   )rE   rn   zTime at which event happened)	help_textz&Time at which GlitchTip accepted eventrs   rt   rm       )
db_defaultzreleases.Release)rk   rl   rC   c                   F    \ rS rSr\R
                  " SS/S9\" S/S9/rSrg)IssueEvent.Meta   rI   z	-receivedr   r   r5   N)	r(   r)   r*   r+   r   Indexr   r   r,   r5   r!   r   rT   r      s$    LL+ 67XJ'
r!   rT   c                   2    \ rS rSr\R
                  rS/rSrg)IssueEvent.PartitioningMeta   receivedr5   N)	r(   r)   r*   r+   r
   RANGEmethodr9   r,   r5   r!   r   rY   r      s    +11lr!   rY   c                     U R                   $ r   )eventIDr   s    r   r   IssueEvent.__str__   s    ||r!   c                 .    U R                   R                  $ r   )r7   hexr   s    r   r   IssueEvent.eventID   s    ww{{r!   c                 N    U R                   R                  SU R                  5      $ )zXOften the title and message are the same. If message isn't stored, assume it's the titlemessagedatagetr   r   s    r   r   IssueEvent.message   s     yy}}Y

33r!   c                 R    U R                   R                  SSU R                  05      $ )zAReturn metadata if exists, else return just the title as metadatar   r   r   r   s    r   r   IssueEvent.metadata   s"     yy}}Z'4::)>??r!   c                 8    U R                   R                  S5      $ )Nplatform)r   r   r   s    r   r   IssueEvent.platform   s    yy}}Z((r!   r5   N)+r(   r)   r*   r+   r   r   uuiduuid4r7   r\   rA   r]   rI   r   r   rn   r   r   	timestampr   r8   r   r   transactionr   r   r   r   r   r   r   tagsr   releaserT   rY   r   r   r   r   r   r   r,   r5   r!   r   r   r      si   			dDJJ	OBev~~>E++A~?U?UVD$$/MNI##.VWH,E"".@AK,,  (..E D((B7BGF D$TV__G
 
    4 4 @ @ ) )r!   r   )*r   django.confr   django.contrib.postgres.fieldsr   django.contrib.postgres.indexesr   django.contrib.postgres.searchr   	django.dbr   django.utilsr   psql_partition.modelsr	   psql_partition.typesr
   glitchtip.base_modelsr   r   r   sentry.constantsr   	constantsr   r   r   r   utilsr   Managerr   Modelr/   r;   r?   ra   rA   r   r   r   r   r5   r!   r   <module>r     s       5 4 <  ! : ; Q Q / L L  Q&.. QCV\\ C
Ev|| E .
% 
;O ;|
 
 	!fll 	!
 
&1))6<< 1)r!   