~frankban/juju-quickstart/env-creation-proto

« back to all changes in this revision

Viewing changes to quickstart/envs/fields.py

  • Committer: Francesco Banconi
  • Date: 2013-11-30 01:02:59 UTC
  • Revision ID: francesco.banconi@canonical.com-20131130010259-tpc31hihheizt3bz
Checkpoint.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import itertools
 
2
import uuid
 
3
 
 
4
from quickstart import settings
 
5
 
 
6
 
 
7
class Field(object):
 
8
 
 
9
    _counter = itertools.count()
 
10
 
 
11
    def __init__(
 
12
            self, name, value, label=None, help='', required=True,
 
13
            editable=True):
 
14
        self.name = name
 
15
        self.value = value
 
16
        self.label = name if label is None else label
 
17
        self.help = help
 
18
        self.required = required
 
19
        self.editable = editable
 
20
        self.position = self._counter.next()
 
21
 
 
22
    def __repr__(self):
 
23
        return '<{}: {}={!r}>'.format(
 
24
            self.__class__.__name__, self.name, self.value)
 
25
 
 
26
    def __str__(self):
 
27
        return str(self.value)
 
28
 
 
29
    def validate(self):
 
30
        if self.required and not self.value:
 
31
            msg = 'a value is required for the {} field'.format(self.label)
 
32
            raise ValueError(msg)
 
33
 
 
34
 
 
35
class StringField(Field):
 
36
 
 
37
    field_type = 'string'
 
38
 
 
39
    def validate(self):
 
40
        if self.value is None:
 
41
            self.value = ''
 
42
        elif isinstance(self.value, basestring):
 
43
            self.value = self.value.strip()
 
44
        else:
 
45
            msg = 'the {} field requires a string value'.format(self.label)
 
46
            raise ValueError(msg)
 
47
        super(StringField, self).validate()
 
48
 
 
49
 
 
50
class BoolField(Field):
 
51
 
 
52
    field_type = 'bool'
 
53
 
 
54
    def __init__(
 
55
            self, name, value, default=False, label=None, help='',
 
56
            editable=True):
 
57
        super(BoolField, self).__init__(
 
58
            name, value, label=label, help=help, required=False,
 
59
            editable=editable)
 
60
        self.default = default
 
61
 
 
62
    def validate(self):
 
63
        if self.value is None:
 
64
            self.value = self.default
 
65
        elif not isinstance(self.value, bool):
 
66
            msg = 'the {} field requires a boolean value'.format(self.label)
 
67
            raise ValueError(msg)
 
68
        super(BoolField, self).validate()
 
69
 
 
70
 
 
71
class AutoGeneratedField(StringField):
 
72
 
 
73
    def __init__(self, name, value=None, label=None, help='', editable=True):
 
74
        if value is None:
 
75
            value = '{}-{}'.format(name, uuid.uuid4().hex)
 
76
        super(AutoGeneratedField, self).__init__(
 
77
            name, value, label=label, help=help, required=False,
 
78
            editable=editable)
 
79
 
 
80
 
 
81
class ProviderField(StringField):
 
82
 
 
83
    def __init__(self, value):
 
84
        super(ProviderField, self).__init__(
 
85
            'type', value, label='provider type',
 
86
            help='the provider type enabled for this environment',
 
87
            required=True, editable=False)