U
    ¿dV                     @   sx  d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ dZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&ee'dZ(dd Z)G dd dej*Z+G dd dZ,G dd dej*Z-G d d! d!e-Z.G d"d# d#e-Z/G d$d% d%e-Z0G d&d' d'e0Z1G d(d) d)e0Z2G d*d+ d+e1Z3d,S )-z>
Appraise evaluation framework

See LICENSE for usage details
    )datetime	timedelta)SequenceMatcher)
format_exc)Set)User)ValidationError)models)escape)format_lazy)utc)ugettext_lazy)_get_logger   
   d   i  i     2   ))ZSRCSource text)ZTGTTarget text)REFzReference text)BADzBad reference)ZCHKzRedundant check)namec                 C   s8   | d }| d d }| d d }| d }t ||||dS )zD
    Converst the given value in secodns to datetime.timedelta.
    iQ i     <   )dayshoursminutessecondsr   )value_daysZ_hoursZ_minsZ_secs r"   J/var/www/rival/public_html/translation-eval/EvalData/models/base_models.pyseconds_to_timedelta1   s
    r$   c                	   @   sd   e Zd ZdZejdeedeededdZ	ejde
edeede
ddZdd	 Zd
d ZdS )ObjectIDz6
    Encodes an object type and ID for retrieval.
    Tz	Type name(max. {value} characters)r    )db_index
max_lengthverbose_name	help_textz
Primary IDc                 C   s   d}dzxz@d | j| j}ddlm}m}m}m}m}m	}m
}	 t|}W n2   d | j| j}
t|
 tt  Y nX W 5 |  S X  )zO
        Returns actual object instance for current ObjectID instance.
        Nz{0}.objects.get(id={1})r   )DataAssessmentTaskDirectAssessmentTaskDirectAssessmentContextTaskDirectAssessmentDocumentTaskMultiModalAssessmentTaskPairwiseAssessmentDocumentTaskPairwiseAssessmentTaskzObjectID {0}.{1} invalid)formattypeName	primaryIDZEvalData.modelsr,   r-   r.   r/   r0   r1   r2   evalLOGGERwarnr   )selfinstance_coder,   r-   r.   r/   r0   r1   r2   _msgr"   r"   r#   get_object_instanceO   s    $

zObjectID.get_object_instancec                 C   s   t | jd | j d | j S )N.)stridr4   r5   r9   r"   r"   r#   __str__p   s    zObjectID.__str__N)__name__
__module____qualname____doc__r
   	CharFieldMAX_TYPENAME_LENGTH_fr4   MAX_PRIMARYID_LENGTHr5   r=   rB   r"   r"   r"   r#   r%   <   s   !r%   c                   @   s.   e Zd ZdZe Zedd Zedd ZdS )AnnotationTaskRegistryz
    Keeps a registry of known annotation task types.

    Use @AnnotationTaskRegistry.register decorator to register class.
    c                 C   s   | j }tj| | S )z7
        Add annotation task type to registry.
        )rC   rL   _ANNOTATION_TASK_REGISTRYadd)obj_namer"   r"   r#   register}   s    zAnnotationTaskRegistry.registerc                   C   s   t jS )z8
        Get annotation task types in registry.
        )rL   rM   r"   r"   r"   r#   	get_types   s    z AnnotationTaskRegistry.get_typesN)	rC   rD   rE   rF   setrM   staticmethodrQ   rR   r"   r"   r"   r#   rL   t   s   
rL   c                       s  e Zd ZdZejddeddZejddeddZejddeddZ	ejdded	dZ
ejdded
dZejdddeddZejdddeddZejdddeddZejedejdddeddZejeddejddddedd	Zejeddejddddedd	Zejeddejddddedd	Zejeddejddddedd	ZejddeddZejddddZG d d! d!Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Z d,d- Z! fd.d/Z"d0d1 Z#  Z$S )2BaseMetadataz7
    Abstract base metadata for all object models.
    TFzDate created)auto_now_addeditabler*   zDate activatedblanknullr*   zDate completedzDate retiredzDate modifiedz
Activated?)rY   r(   defaultr*   z
Completed?zRetired?z"%(app_label)s_%(class)s_created_byz%(app_label)s_%(class)ssz
Created by)r(   	on_deleterW   related_namerelated_query_namer*   z$%(app_label)s_%(class)s_activated_byzActivated by)rY   r(   r\   rW   rZ   r]   r^   r*   z$%(app_label)s_%(class)s_completed_byzCompleted byz"%(app_label)s_%(class)s_retired_byz
Retired byz#%(app_label)s_%(class)s_modified_byzModified byzRaw data)rY   rW   r*    )rY   r[   rW   c                   @   s   e Zd ZdZdgZdS )zBaseMetadata.MetaT	_str_nameNrC   rD   rE   abstractorderingr"   r"   r"   r#   Meta   s   rd   c                 C   sX   t  jtd}|| _|r|nd| _|| _|r2|nd| _|| _|rF|nd| _	| 
  dS )zz
        Sets boolean states for current model instance.
        Also sets respective dates for all three states.
        )tzinfoN)r   utcnowreplacer   	activateddateActivated	completeddateCompletedretireddateRetiredsave)r9   rh   rj   rl   Zutc_nowr"   r"   r#   _set_boolean_states   s    z BaseMetadata._set_boolean_statesc                 C   s   |  ddd dS )zy
        Sets activated=True for current model instance.
        This implies completed=False and retired=False.
        TFNro   rA   r"   r"   r#   activate  s    zBaseMetadata.activatec                 C   s   |  ddd dS )zy
        Sets completed=True for current model instance.
        This implies activated=False and retired=False.
        FTNrp   rA   r"   r"   r#   complete  s    zBaseMetadata.completec                 C   s   |  ddd dS )zz
        Sets retired=True for current model instance.

        This implies activated=False and completed=False.
        FTNrp   rA   r"   r"   r#   retire   s    zBaseMetadata.retirec                 C   s*   z|    W dS  tk
r$   Y dS X dS )z7
        Validates the current model instance.
        TFN)
full_cleanr	   rA   r"   r"   r#   is_valid(  s
    zBaseMetadata.is_validc                 C   s   d | jj| jS )zF
        Generate human readable name for use with __str__().
        z{0}[{1}])r3   	__class__rC   r@   rA   r"   r"   r#   _generate_str_name3  s    zBaseMetadata._generate_str_namec                    s~   | j rh|  }| j|kr|| _tjj| jj| j d}| shtjj	| jj| j d}d
|j }t| tt| j|| dS )z
        For object instances with an ID, we precompute the _str_name
        attribute so that future __str__() lookups are efficient.

        Also, we ensure that a matching ObjectID binding is created.
        )r4   r5   zCreated serialized ObjectID:{0}N)r@   rw   r`   r%   objectsfilterrv   rC   existscreater3   r7   infosuperrU   rn   )r9   argskwargsZ	_new_nameqsZ_serializedr<   rv   r"   r#   rn   9  s     
  
zBaseMetadata.savec                 C   s   | j dkr|   | j S )Nr_   )r`   rn   rA   r"   r"   r#   rB   R  s    
zBaseMetadata.__str__)%rC   rD   rE   rF   r
   DateTimeFieldrI   ZdateCreatedri   rk   rm   ZdateModifiedBooleanFieldrh   rj   rl   
ForeignKeyr   PROTECTZ	createdByZactivatedByZcompletedByZ	retiredByZ
modifiedBy	TextFieldZrawDatar`   rd   ro   rq   rr   rs   ru   rw   rn   rB   __classcell__r"   r"   r   r#   rU      s             
rU   c                       s   e Zd ZdZejde e d dddZejee	de	e
dedd	Zejee	d
e	e
dedd	Zejee	de	e
dedd	Zd fdd	Z fddZ fddZdd Z  ZS )Marketz*
    Models a language/locale market.
       FT)r)   rW   uniquezSource languager&   r'   r)   r*   r+   zTarget languagezDomain nameNc                    sR   d | j| j| j}tjj|d}| r>tt	t
d|dtt| | dS )zD
        Verifies that desired marketID is still available.
        {0}_{1}_{2}marketIDz8Market with identical marketID ("{mID}") already exists.)ZmIDN)r3   sourceLanguageCodetargetLanguageCode
domainNamer   rx   ry   rz   r	   rI   rJ   r}   clean_fields)r9   exclude_new_marketID_market_instancer   r"   r#   r   ~  s     	zMarket.clean_fieldsc                    s0   d | j| j| j}|| _tt| j|| d S )Nr   )r3   r   r   r   r   r}   r   rn   )r9   r~   r   r   r   r"   r#   rn     s    zMarket.savec                    sr   d | j| j| j}tjj|d}t| dr6| jdkrD|	 rddS n |
 }|dk	rd| j|jkrddS tt|  S )zV
        Validates the current Market instance, checking marketID uniqueness.
        r   r   r   r_   FN)r3   r   r   r   r   rx   ry   hasattrr   rz   getr@   r}   ru   )r9   Z_expected_marketIDr   Z_market_instance_objr   r"   r#   my_is_valid  s    zMarket.my_is_validc                 C   s   | j S )Nr   rA   r"   r"   r#   rw     s    zMarket._generate_str_name)N)rC   rD   rE   rF   r
   rG   MAX_LANGUAGECODE_LENGTHMAX_DOMAINNAME_LENGTHr   rI   rJ   r   r   r   r   rn   r   rw   r   r"   r"   r   r#   r   Z  s2   r   c                   @   s   e Zd ZdZejedejdZej	e
edeede
ddZej	eedeededdZej	eed	eededdZG d
d dZdd ZdS )Metadataz.
    Models metadata associated to tasks.
    Tr(   r\   zCorpus namer&   r'   r   zVersion infoZSourcec                   @   s   e Zd ZdgZdZdS )zMetadata.Metar`   zMetadata recordN)rC   rD   rE   rc   r*   r"   r"   r"   r#   rd     s   rd   c                 C   s   d | jj| jj| j| jS )Nz{0}->{1}/{2}["{3}"])r3   marketr   r   
corpusNameversionInforA   r"   r"   r#   rw     s    zMetadata._generate_str_nameN)rC   rD   rE   rF   r
   r   r   r   r   rG   MAX_CORPUSNAME_LENGTHrI   rJ   r   MAX_VERSIONINFO_LENGTHr   MAX_SOURCE_LENGTHsourcerd   rw   r"   r"   r"   r#   r     s&   r   c                       st   e Zd ZdZejededdZeje	de
eddZejedejdZG d	d
 d
Z fddZdd Z  ZS )EvalItemzu
    Abstract base class for evaluation data items.

    Models corresponding, 1-based, integer ID and metadata.
    zItem IDz	(1-based))r*   r+   Tz	Item type)choicesr(   r)   r*   r   c                   @   s   e Zd ZdZdgZdS )zEvalItem.MetaTr`   Nra   r"   r"   r"   r#   rd     s   rd   c                    sD   t | dr| j sdS t| jts(dS | jdk r6dS tt|  S )zR
        Validates the current evaluation item, checking ID and metadata.
        metadataF   )r   r   ru   
isinstanceitemIDintr}   r   rA   r   r"   r#   ru     s    
zEvalItem.is_validc                 C   s   d | jj| j| jS )Nz{0}.{1}[{2}])r3   rv   rC   r   r   rA   r"   r"   r#   rw     s
      zEvalItem._generate_str_name)rC   rD   rE   rF   r
   PositiveIntegerFieldrI   r   rG   SET_ITEMTYPE_CHOICESMAX_ITEMTYPE_LENGTHZitemTyper   r   r   r   rd   ru   rw   r   r"   r"   r   r#   r     s    r   c                       s`   e Zd ZdZejeedeededdZ	ej
eedeededdZ fddZ  ZS )	TextSegmentz'
    Models a single text segment.
    z
Segment IDr&   r'   r   zSegment textc                    s@   t | jtdsdS t| j}|dk s.|tkr2dS tt|  S )zL
        Validates the current TextSegment instance, checking text.
        This is a test sentence.Fr   )r   segmentTexttypelenMAX_SEGMENTTEXT_LENGTHr}   r   ru   r9   _lenr   r"   r#   ru   #  s    
zTextSegment.is_valid)rC   rD   rE   rF   r
   rG   MAX_SEGMENTID_LENGTHrI   rJ   Z	segmentIDr   r   r   ru   r   r"   r"   r   r#   r     s   r   c                       s   e Zd ZdZejeedeededdZ	ej
deddZejeed	eededdZej
ded
dZ fddZ  ZS )TextPairz-
    Models a pair of two text segments.
    z	Source IDr&   r'   r   Tr   rY   r*   z	Target IDr   c                    sr   t | jtdrdS t| j}|dk s.|tkr2dS t | jtdrFdS t| j}|dk s`|tkrddS tt|  S )zI
        Validates the current TextPair instance, checking text.
        r   Fr   )	r   
sourceTextr   r   r   
targetTextr}   r   ru   r   r   r"   r#   ru   O  s    

zTextPair.is_valid)rC   rD   rE   rF   r
   rG   r   rI   rJ   ZsourceIDr   r   ZtargetIDr   ru   r   r"   r"   r   r#   r   3  s(   r   c                	       s   e Zd ZdZejeedeededdZ	ej
deddZejdeed	eededd
Zej
ddeddZej
ddeddZej
ddeddZej
ddeddZej
ddeddZdd ZdddZdddZdd Z fddZ  ZS )TextSegmentWithTwoTargetsz=
    Models a text segment with one or two sub-segments.
    zItem ID (1)r&   r'   r   TzText (1)r   zItem ID (2))rZ   r)   r*   r+   zText (2)rX   zContext (left)zContext (right)zTarget context (1)zTarget context (2)c                 C   s   | j p
| jS )z3Checks if the current segment has context provided.)contextLeftcontextRightrA   r"   r"   r#   has_context  s    z%TextSegmentWithTwoTargets.has_contextr    c                 C   s&   | j r"|| j d| d S dS )z
        Returns formatted last 5 sentences from the left context.
        Use separator='<br>' to show one sentence per line.
        
Nr_   )r   joinsplit)r9   last	separatorr"   r"   r#   context_left  s    z&TextSegmentWithTwoTargets.context_leftc                 C   s$   | j r || j dd| S dS )z
        Returns formatted first 5 sentences from the right context.
        Use separator='<br>' to show one sentence per line.
        r   Nr_   )r   r   r   )r9   firstr   r"   r"   r#   context_right  s    z'TextSegmentWithTwoTargets.context_rightc                 C   sD  | j r| js| j | jfS t| j  }t| j }td||}d}d}| D ]\}}}}	}
|dkr|dd|||  7 }|dd||	|
  7 }qP|dkr|dd|||  d 7 }|dd||	|
  d 7 }qP|dkr|d	d||	|
  d 7 }qP|d
krP|dd|||  d 7 }qP| | fS )a  
        Returns the pair of texts with HTML tags highlighting token differences.
        Both texts must be non empty.
        HTML tags in both texts will be escaped automatically.

        For example,
            'a b c d e' and 'a B c e f'
        will become:
            'a <span class="diff diff-sub">b</span> c <span class="diff diff-del">d</span> e',
            'a <span class="diff diff-sub">B</span> c e <span class="diff diff-ins">f</span>'
        Nr_   equalr   rg   z <span class="diff diff-sub">z</span>insertz <span class="diff diff-ins">deletez <span class="diff diff-del">)target1Texttarget2Textr   r   r   get_opcodesr   strip)r9   Ztoks1Ztoks2matcherZtext1Ztext2tagi1i2j1j2r"   r"   r#   target_texts_with_diffs  s6    
z1TextSegmentWithTwoTargets.target_texts_with_diffsc                    s   t | jtdrdS t| j}|dk s.|tkr2dS trttdkrt | jtdrVdS t| j}|dk sp|tkrtdS | j| jkrdS tt|  S )zb
        Validates the current TextSegmentWithTwoTargets instance, checking
        text.
        r   Fr   r   )	r   r   r   r   r   r   r}   r   ru   r   r   r"   r#   ru     s    

z"TextSegmentWithTwoTargets.is_valid)r   r   )r   r   )rC   rD   rE   rF   r
   rG   r   rI   rJ   Z	target1IDr   r   Z	target2IDr   r   r   Ztarget1ContextLeftZtarget2ContextLeftr   r   r   r   ru   r   r"   r"   r   r#   r   d  s\           

+r   N)4rF   r   r   difflibr   	tracebackr   typingr   django.contrib.auth.modelsr   django.core.exceptionsr	   	django.dbr
   django.utils.htmlr   django.utils.textr   rJ   Zdjango.utils.timezoner   django.utils.translationr   rI   ZAppraise.utilsr   r   r   r   r   r   r   r   r   ZMAX_REQUIREDANNOTATIONS_VALUErH   rK   r   rC   r7   r$   Modelr%   rL   rU   r   r   r   r   r   r   r"   r"   r"   r#   <module>   sJ   
8 Lb&/"1