Revision 78dec216
b/aquarium/admin.py | ||
---|---|---|
1 |
from django.contrib import admin |
|
2 |
from django import forms |
|
3 |
from django.db import models |
|
4 |
from django.utils.encoding import iri_to_uri |
|
5 |
from django.utils.translation import gettext_lazy as _ |
|
6 |
from models import * |
|
7 |
|
|
8 |
class LimitForm(forms.ModelForm): |
|
9 |
class Meta: |
|
10 |
model = Limit |
|
11 |
|
|
12 |
class LimitAdmin(admin.ModelAdmin): |
|
13 |
"" |
|
14 |
|
|
15 |
form = LimitForm |
|
16 |
|
|
17 |
class UserForm(forms.ModelForm): |
|
18 |
class Meta: |
|
19 |
model = OceanUser |
|
20 |
|
|
21 |
class UserAdmin(admin.ModelAdmin): |
|
22 |
"" |
|
23 |
form = UserForm |
|
24 |
|
|
25 |
|
|
26 |
class UserLimitForm(forms.ModelForm): |
|
27 |
class Meta: |
|
28 |
model = UserLimit |
|
29 |
|
|
30 |
class UserLimitAdmin(admin.ModelAdmin): |
|
31 |
"" |
|
32 |
|
|
33 |
form = UserLimitForm |
|
34 |
|
|
35 |
class FlavorForm(forms.ModelForm): |
|
36 |
class Meta: |
|
37 |
model = Flavor |
|
38 |
|
|
39 |
class FlavorAdmin(admin.ModelAdmin): |
|
40 |
"" |
|
41 |
|
|
42 |
form = FlavorForm |
|
43 |
|
|
44 |
|
|
45 |
class VirtualMachineForm(forms.ModelForm): |
|
46 |
class Meta: |
|
47 |
model = VirtualMachine |
|
48 |
|
|
49 |
class VirtualMachineAdmin(admin.ModelAdmin): |
|
50 |
"" |
|
51 |
|
|
52 |
form = VirtualMachineForm |
|
53 |
|
|
54 |
|
|
55 |
class ChargingLogForm(forms.ModelForm): |
|
56 |
class Meta: |
|
57 |
model = ChargingLog |
|
58 |
|
|
59 |
class ChargingLogAdmin(admin.ModelAdmin): |
|
60 |
"" |
|
61 |
|
|
62 |
form = ChargingLogForm |
|
63 |
|
|
64 |
admin.site.register(Limit, LimitAdmin) |
|
65 |
admin.site.register(OceanUser, UserAdmin) |
|
66 |
admin.site.register(UserLimit, UserLimitAdmin) |
|
67 |
admin.site.register(Flavor, FlavorAdmin) |
|
68 |
admin.site.register(VirtualMachine, VirtualMachineAdmin) |
|
69 |
admin.site.register(ChargingLog, ChargingLogAdmin) |
|
70 |
|
b/aquarium/models.py | ||
---|---|---|
1 |
# vim: ts=4 sts=4 et ai sw=4 fileencoding=utf-8 |
|
2 |
|
|
3 |
from django.db import models |
|
4 |
from django.contrib.auth.models import User |
|
5 |
|
|
6 |
class Limit(models.Model): |
|
7 |
description = models.CharField(max_length=45) |
|
8 |
|
|
9 |
def __unicode__(self): |
|
10 |
return self.description |
|
11 |
|
|
12 |
|
|
13 |
class OceanUser(models.Model): |
|
14 |
name = models.CharField(max_length=255) |
|
15 |
credit = models.IntegerField() |
|
16 |
quota = models.IntegerField() |
|
17 |
created = models.DateField() |
|
18 |
monthly_rate = models.IntegerField() |
|
19 |
user = models.ForeignKey(User, blank=True, null=True) |
|
20 |
limits = models.ManyToManyField(Limit, through='UserLimit') |
|
21 |
|
|
22 |
def __unicode__(self): |
|
23 |
return self.name |
|
24 |
|
|
25 |
class UserLimit(models.Model): |
|
26 |
user = models.ForeignKey(OceanUser) |
|
27 |
limit = models.ForeignKey(Limit) |
|
28 |
value = models.IntegerField() |
|
29 |
|
|
30 |
class Meta: |
|
31 |
unique_together = ('user', 'limit') |
|
32 |
|
|
33 |
def __unicode__(self): |
|
34 |
return u'Limit %s for user %s: %d' % (self.limit, self.user, self.value) |
|
35 |
|
|
36 |
|
|
37 |
class Flavor(models.Model): |
|
38 |
name = models.CharField(max_length=255, unique=True) |
|
39 |
description = models.CharField(max_length=1000) |
|
40 |
cost_active = models.PositiveIntegerField() |
|
41 |
cost_inactive = models.PositiveIntegerField() |
|
42 |
|
|
43 |
def __unicode__(self): |
|
44 |
return self.name |
|
45 |
|
|
46 |
class VirtualMachine(models.Model): |
|
47 |
STATES = ( |
|
48 |
(0, 'down'), |
|
49 |
(1, 'up'), |
|
50 |
# FIXME |
|
51 |
) |
|
52 |
|
|
53 |
name = models.CharField(max_length=255) |
|
54 |
created = models.DateTimeField() |
|
55 |
state = models.IntegerField(choices=STATES) |
|
56 |
started = models.DateTimeField() |
|
57 |
owner = models.ForeignKey(OceanUser) |
|
58 |
flavor = models.ForeignKey(Flavor) |
|
59 |
|
|
60 |
class Meta: |
|
61 |
verbose_name = u'Virtual machine' |
|
62 |
get_latest_by = 'created' |
|
63 |
|
|
64 |
def __unicode__(self): |
|
65 |
return self.name |
|
66 |
|
|
67 |
class ChargingLog(models.Model): |
|
68 |
vm = models.ForeignKey(VirtualMachine) |
|
69 |
date = models.DateTimeField() |
|
70 |
credit = models.IntegerField() |
|
71 |
message = models.CharField(max_length=1000) |
|
72 |
|
|
73 |
class Meta: |
|
74 |
verbose_name = u'Charging log' |
b/aquarium/tests.py | ||
---|---|---|
1 |
""" |
|
2 |
This file demonstrates two different styles of tests (one doctest and one |
|
3 |
unittest). These will both pass when you run "manage.py test". |
|
4 |
|
|
5 |
Replace these with more appropriate tests for your application. |
|
6 |
""" |
|
7 |
|
|
8 |
from django.test import TestCase |
|
9 |
|
|
10 |
class SimpleTest(TestCase): |
|
11 |
def test_basic_addition(self): |
|
12 |
""" |
|
13 |
Tests that 1 + 1 always equals 2. |
|
14 |
""" |
|
15 |
self.failUnlessEqual(1 + 1, 2) |
|
16 |
|
|
17 |
__test__ = {"doctest": """ |
|
18 |
Another way to test that 1 + 1 is equal to 2. |
|
19 |
|
|
20 |
>>> 1 + 1 == 2 |
|
21 |
True |
|
22 |
"""} |
|
23 |
|
b/aquarium/views.py | ||
---|---|---|
1 |
# Create your views here. |
/dev/null | ||
---|---|---|
1 |
# vim: ts=4 sts=4 et ai sw=4 fileencoding=utf-8 |
|
2 |
|
|
3 |
from django.db import models |
|
4 |
|
|
5 |
class Limit(models.Model): |
|
6 |
description = models.CharField(max_length=45) |
|
7 |
|
|
8 |
def __unicode__(self): |
|
9 |
return self.description |
|
10 |
|
|
11 |
|
|
12 |
class OceanUser(models.Model): |
|
13 |
name = models.CharField(max_length=255) |
|
14 |
credit = models.IntegerField() |
|
15 |
quota = models.IntegerField() |
|
16 |
created = models.DateField() |
|
17 |
monthly_rate = models.IntegerField() |
|
18 |
limits = models.ManyToManyField(Limit, through='UserLimit') |
|
19 |
|
|
20 |
def __unicode__(self): |
|
21 |
return self.name |
|
22 |
|
|
23 |
class UserLimit(models.Model): |
|
24 |
user = models.ForeignKey(User) |
|
25 |
limit = models.ForeignKey(Limit) |
|
26 |
value = models.IntegerField() |
|
27 |
|
|
28 |
class Meta: |
|
29 |
unique_together = ('user', 'limit') |
|
30 |
|
|
31 |
def __unicode__(self): |
|
32 |
return u'Limit %s for user %s: %d' % (self.limit, self.user, self.value) |
|
33 |
|
|
34 |
|
|
35 |
class Flavor(models.Model): |
|
36 |
name = models.CharField(max_length=255, unique=True) |
|
37 |
description = models.CharField(max_length=1000) |
|
38 |
cost_active = models.PositiveIntegerField() |
|
39 |
cost_inactive = models.PositiveIntegerField() |
|
40 |
|
|
41 |
def __unicode__(self): |
|
42 |
return self.name |
|
43 |
|
|
44 |
class VirtualMachine(models.Model): |
|
45 |
STATES = ( |
|
46 |
(0, 'down'), |
|
47 |
(1, 'up'), |
|
48 |
# FIXME |
|
49 |
) |
|
50 |
|
|
51 |
name = models.CharField(max_length=255) |
|
52 |
created = models.DateTimeField() |
|
53 |
state = models.IntegerField(choices=STATES) |
|
54 |
started = models.DateTimeField() |
|
55 |
owner = models.ForeignKey(User) |
|
56 |
flavor = models.ForeignKey(Flavor) |
|
57 |
|
|
58 |
class Meta: |
|
59 |
verbose_name = u'Virtual machine' |
|
60 |
get_latest_by = 'created' |
|
61 |
|
|
62 |
def __unicode__(self): |
|
63 |
return self.name |
|
64 |
|
|
65 |
class ChargingLog(models.Model): |
|
66 |
vm = models.ForeignKey(VirtualMachine) |
|
67 |
date = models.DateTimeField() |
|
68 |
credit = models.IntegerField() |
|
69 |
message = models.CharField(max_length=1000) |
|
70 |
|
|
71 |
class Meta: |
|
72 |
verbose_name = u'Charging log' |
b/settings.py.dist | ||
---|---|---|
13 | 13 |
|
14 | 14 |
DATABASES = { |
15 | 15 |
'default': { |
16 |
'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. |
|
17 |
'NAME': '', # Or path to database file if using sqlite3. |
|
16 |
'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
|
|
17 |
'NAME': 'aquarium.db', # Or path to database file if using sqlite3.
|
|
18 | 18 |
'USER': '', # Not used with sqlite3. |
19 | 19 |
'PASSWORD': '', # Not used with sqlite3. |
20 | 20 |
'HOST': '', # Set to empty string for localhost. Not used with sqlite3. |
... | ... | |
77 | 77 |
TEMPLATE_CONTEXT_PROCESSORS = ( |
78 | 78 |
"django.core.context_processors.request", |
79 | 79 |
'django.core.context_processors.i18n', |
80 |
'django.contrib.auth.context_processors.auth' |
|
80 | 81 |
) |
81 | 82 |
|
82 | 83 |
MIDDLEWARE_CLASSES = ( |
... | ... | |
102 | 103 |
'django.contrib.sessions', |
103 | 104 |
'django.contrib.sites', |
104 | 105 |
'django.contrib.messages', |
105 |
# 'django.contrib.admin',
|
|
106 |
'django.contrib.admin', |
|
106 | 107 |
# 'django.contrib.admindocs', |
107 | 108 |
'synnefo.auth', |
108 | 109 |
'synnefo.api', |
109 | 110 |
'synnefo.ui', |
111 |
'synnefo.aquarium' |
|
110 | 112 |
) |
111 | 113 |
|
112 | 114 |
GANETI_CLUSTER_INFO = None #('ganeti.example.org', 5080) |
b/urls.py | ||
---|---|---|
4 | 4 |
# |
5 | 5 |
|
6 | 6 |
from django.conf.urls.defaults import * |
7 |
from django.contrib import admin |
|
8 |
|
|
9 |
admin.autodiscover() |
|
7 | 10 |
|
8 | 11 |
urlpatterns = patterns('', |
9 | 12 |
(r'^lang/$', 'synnefo.ui.i18n.set_language'), |
10 | 13 |
(r'^auth/api/', include('synnefo.auth.urls')), |
11 | 14 |
(r'^api/', include('synnefo.api.urls')), |
12 | 15 |
(r'^', include('synnefo.ui.urls')), |
13 |
) |
|
16 |
(r'^admin/(.*)', admin.site.root) |
|
17 |
) |
Also available in: Unified diff