root / env / lib / python2.7 / site-packages / south / tests / fakeapp / models.py @ d1a4905f
History | View | Annotate | Download (3.78 KB)
1 | d1a4905f | officers | # -*- coding: UTF-8 -*-
|
---|---|---|---|
2 | |||
3 | from django.db import models |
||
4 | from django.contrib.auth.models import User as UserAlias |
||
5 | |||
6 | from south.modelsinspector import add_introspection_rules |
||
7 | |||
8 | on_delete_is_available = hasattr(models, "PROTECT") # models here is django.db.models |
||
9 | |||
10 | def default_func(): |
||
11 | return "yays" |
||
12 | |||
13 | # An empty case.
|
||
14 | class Other1(models.Model): pass |
||
15 | |||
16 | # Another one
|
||
17 | class Other3(models.Model): pass |
||
18 | def get_sentinel_object(): |
||
19 | """
|
||
20 | A function to return the object to be used in place of any deleted object,
|
||
21 | when using the SET option for on_delete.
|
||
22 | """
|
||
23 | # Create a new one, so we always have an instance to test with. Can't work!
|
||
24 | return Other3()
|
||
25 | |||
26 | # Nastiness.
|
||
27 | class HorribleModel(models.Model): |
||
28 | "A model to test the edge cases of model parsing"
|
||
29 | |||
30 | ZERO, ONE = range(2) |
||
31 | |||
32 | # First, some nice fields
|
||
33 | name = models.CharField(max_length=255)
|
||
34 | short_name = models.CharField(max_length=50)
|
||
35 | slug = models.SlugField(unique=True)
|
||
36 | |||
37 | # A ForeignKey, to a model above, and then below
|
||
38 | o1 = models.ForeignKey(Other1) |
||
39 | o2 = models.ForeignKey('Other2')
|
||
40 | |||
41 | if on_delete_is_available:
|
||
42 | o_set_null_on_delete = models.ForeignKey('Other3', null=True, on_delete=models.SET_NULL) |
||
43 | o_cascade_delete = models.ForeignKey('Other3', null=True, on_delete=models.CASCADE, related_name="cascademe") |
||
44 | o_protect = models.ForeignKey('Other3', null=True, on_delete=models.PROTECT, related_name="dontcascademe") |
||
45 | o_default_on_delete = models.ForeignKey('Other3', null=True, default=1, on_delete=models.SET_DEFAULT, related_name="setmedefault") |
||
46 | o_set_on_delete_function = models.ForeignKey('Other3', null=True, default=1, on_delete=models.SET(get_sentinel_object), related_name="setsentinel") |
||
47 | o_set_on_delete_value = models.ForeignKey('Other3', null=True, default=1, on_delete=models.SET(get_sentinel_object()), related_name="setsentinelwithactualvalue") # dubious case |
||
48 | o_no_action_on_delete = models.ForeignKey('Other3', null=True, default=1, on_delete=models.DO_NOTHING, related_name="deletemeatyourperil") |
||
49 | |||
50 | |||
51 | # Now to something outside
|
||
52 | user = models.ForeignKey(UserAlias, related_name="horribles")
|
||
53 | |||
54 | # Unicode!
|
||
55 | code = models.CharField(max_length=25, default="↑↑↓↓←→←→BA") |
||
56 | |||
57 | # Odd defaults!
|
||
58 | class_attr = models.IntegerField(default=ZERO) |
||
59 | func = models.CharField(max_length=25, default=default_func)
|
||
60 | |||
61 | # Time to get nasty. Define a non-field choices, and use it
|
||
62 | choices = [('hello', '1'), ('world', '2')] |
||
63 | choiced = models.CharField(max_length=20, choices=choices)
|
||
64 | |||
65 | class Meta: |
||
66 | db_table = "my_fave"
|
||
67 | verbose_name = "Dr. Strangelove," + \
|
||
68 | """or how I learned to stop worrying
|
||
69 | and love the bomb"""
|
||
70 | |||
71 | # Now spread over multiple lines
|
||
72 | multiline = \ |
||
73 | models.TextField( |
||
74 | ) |
||
75 | |||
76 | # Special case.
|
||
77 | class Other2(models.Model): |
||
78 | # Try loading a field without a newline after it (inspect hates this)
|
||
79 | close_but_no_cigar = models.PositiveIntegerField(primary_key=True)
|
||
80 | |||
81 | class CustomField(models.IntegerField): |
||
82 | def __init__(self, an_other_model, **kwargs): |
||
83 | super(CustomField, self).__init__(**kwargs) |
||
84 | self.an_other_model = an_other_model
|
||
85 | |||
86 | add_introspection_rules([ |
||
87 | ( |
||
88 | [CustomField], |
||
89 | [], |
||
90 | {'an_other_model': ('an_other_model', {})}, |
||
91 | ), |
||
92 | ], ['^south\.tests\.fakeapp\.models\.CustomField'])
|
||
93 | |||
94 | class BaseModel(models.Model): |
||
95 | pass
|
||
96 | |||
97 | class SubModel(BaseModel): |
||
98 | others = models.ManyToManyField(Other1) |
||
99 | custom = CustomField(Other2) |
||
100 | |||
101 | class CircularA(models.Model): |
||
102 | c = models.ForeignKey('CircularC')
|
||
103 | |||
104 | class CircularB(models.Model): |
||
105 | a = models.ForeignKey(CircularA) |
||
106 | |||
107 | class CircularC(models.Model): |
||
108 | b = models.ForeignKey(CircularB) |
||
109 | |||
110 | class Recursive(models.Model): |
||
111 | self = models.ForeignKey('self') |