from appy.gen import *
class Zzz:
    root = True
    def show_f2(self): return True
    def validate_i2(self, value):
        if (value != None) and (value < 10):
            return 'Value must be higher or equal to 10.'
        return True
    title=String(multiplicity=(0,1), show=False)
    i1 = Integer(show=False)
    i2 = Integer(validator = validate_i2)
    f1 = Float(show=show_f2, page='other')
    f2 = Float(multiplicity=(1,1))

class SeveralStrings:
    root=True
    anEmail = String(validator=String.EMAIL)
    anUrl = String(validator=String.URL)
    anAlphanumericValue = String(validator=String.ALPHANUMERIC)
    aSingleSelectedValue = String(validator=['valueA', 'valueB', 'valueC'])
    aSingleMandatorySelectedValue = String(
        validator=['valueX', 'valueY', 'valueZ'], multiplicity=(1,1))
    aMultipleSelectedValue = String(
        validator=['valueS', 'valueT', 'valueU', 'valueV'],
        multiplicity=(1,None), searchable=True)
    aBooleanValue = Boolean(default=True)
    dateWithHour = Date()
    dateWithoutHour = Date(format=Date.WITHOUT_HOUR)
    anAttachedFile = File()
    anAttachedImage = File(isImage=True)

class Product:
    root = True
    description = String(format=String.TEXT)
    stock = Integer()
    def needOrder(self): return self.stock < 3
    def orderProduct(self): self.stock = 3
    order = Action(action=orderProduct, show=needOrder)

class Order:
    description = String(format=String.TEXT)
    number = Float(show=False)
    # Reference field
    def getReference(self): return 'OR-%f' % self.number
    reference = Computed(method=getReference)
    def filterProducts(self, allProducts):
        return [f for f in allProducts if f.description.find('Descr') != -1]
    products = Ref(Product, add=False, link=True, multiplicity=(1,None),
                   back=Ref(attribute='orders'), showHeaders=True,
                   shownInfo=('description','title', 'order'),
                   select=filterProducts)
    def onEdit(self, created):
        if created:
            import random
            self.number = random.random()

class Client:
    root = True
    folder = True
    title = String(show=False)
    firstName = String()
    name = String()
    orders = Ref(Order, add=True, link=False, multiplicity=(0,None),
                 back=Ref(attribute='client'), showHeaders=True,
                 shownInfo=('reference', 'description', 'products'), wide=True)
    def onEdit(self, created):
        self.title = self.firstName + ' ' + self.name