<div dir="ltr"><br><div class="gmail_extra">Hi Aurélien,<br><br></div><div class="gmail_extra">Thank you very much for your quick answer.<br><br></div><div class="gmail_extra">I think I will take hooks as solution for now ;), but debugging should be a good thing to do in order to understand better the constraints.<br>
<br></div><div class="gmail_extra">I appreciate very much your help.<br><br></div><div class="gmail_extra">Best Regards!<br>Carlos Balderas<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, May 13, 2014 at 10:37 AM, Aurélien Campéas <span dir="ltr"><<a href="mailto:aurelien.campeas@logilab.fr" target="_blank">aurelien.campeas@logilab.fr</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="">On 13/05/2014 01:31, Carlos Balderas wrote:<br>
> Hello List,<br>
<br>
</div>Hello Carlos,<br>
<div><div class="h5"><br>
><br>
> I am failing to make a validation using RQLConstraint. What I am trying<br>
> to accomplish is to validate dates among attributes of the same entity,<br>
> making the following validations:<br>
><br>
>  (finished date >= prevision date) & (prevision date >= start date)<br>
><br>
> none of the dates are required, but if you need to set prevision date<br>
> then you must set start date, same thing for finished date.<br>
><br>
> Here is the entity:<br>
><br>
> class ProjectStage(WorkflowableEntityType):<br>
>     """a project stage groups a list of activities/todo's to be completed<br>
>     in certain amount of time.<br>
>     """<br>
>     start = Datetime(description=_('start date'),<br>
>                  constraints=[<br>
>             RQLConstraint('(S start NULL)'<br>
>                           ' OR (S start <= B, S prevision B)'<br>
>                           ' OR (S prevision NULL)',<br>
>                           msg=_('start date should be'<br>
>                                 ' less than or equal to'<br>
>                                 ' prevision date')),<br>
>             RQLConstraint('(S start NULL)'<br>
>                           ' OR (S start <= B, S finished B)'<br>
>                           ' OR (S finished NULL)',<br>
>                           msg=_('start date should be'<br>
>                                 ' less than or equal to'<br>
>                                 ' finish date'))])<br>
>     prevision = Datetime(description=_('estimated finish date'),<br>
>                      constraints=[<br>
>             RQLConstraint('(S prevision NULL)'<br>
>                           ' OR (S prevision >= B, S start B)'<br>
>                           ' OR (S start NULL)',<br>
>                           msg=_('prevision date should be'<br>
>                                 ' greater than or equal to'<br>
>                                 ' start date'))])<br>
>     finished = Datetime(description=_('real finish date'),<br>
>                         constraints=[<br>
>             RQLConstraint('(S finished NULL)'<br>
>                           ' OR (S finished >= B, S start B)'<br>
>                           ' OR (S start NULL)',<br>
>                           msg=_('finish date should be'<br>
>                                 ' greater than or equal to'<br>
>                                 ' start date'))])<br>
<br>
</div></div>Also given how you have:<br>
<br>
* to defend against unset attributes<br>
* 4 attributes<br>
<br>
maybe it would be easier to implement with a hook on entity<br>
creation/update (code-complexity-wise) ...<br>
<div class=""><br>
><br>
><br>
> At the time I am creating the ProjectStage entity I am getting the<br>
> message of constraint violation even though the date values are correct<br>
> according to the explained logic.<br>
><br>
> I understand this functionality can be covered by using hooks, but I<br>
> really like to know if what I am trying to do is possible by using<br>
> RQLConstraints or to find out what I am doing wrong.<br>
<br>
</div>You will probably want to debug this with DBG_OPS, and putting prints<br>
in RepoEnforcedRQLConstraintMixIn.exec_query maybe (in cw/schema.py).<br>
<br>
Also proofreading surely helps :)<br>
Note, e.g. the following:<br>
<div class=""><br>
RQLConstraint('(S start NULL)'<br>
              ' OR (S start <= B, S finished B)'<br>
</div>              ' OR (S finished NULL)')<br>
<br>
Maybe you need:<br>
<br>
 ((S start NULL) OR (S finished NULL)) OR (S start <= B, S finished B)<br>
<br>
(or something).<br>
<br>
Regards,<br>
Aurélien.<br>
_______________________________________________<br>
Cubicweb mailing list<br>
<a href="mailto:Cubicweb@lists.cubicweb.org">Cubicweb@lists.cubicweb.org</a><br>
<a href="http://lists.cubicweb.org/mailman/listinfo/cubicweb" target="_blank">http://lists.cubicweb.org/mailman/listinfo/cubicweb</a><br>
</blockquote></div><br><br clear="all"><br>-- <br><div>Carlos Balderas</div>
</div></div>