Statistics
| Branch: | Tag: | Revision:

root / README.develop @ 5509b599

History | View | Annotate | Download (10.5 kB)

1 bbd4f788 Georgios Gousios
DEVELOP.txt - Information on how to setup a development environment. 
2 bbd4f788 Georgios Gousios
3 bbd4f788 Georgios Gousios
Dependencies
4 bbd4f788 Georgios Gousios
------------
5 bbd4f788 Georgios Gousios
6 602d6541 Vangelis Koukis
Synnefo is written in Python 2.6 and depends on the following Python modules
7 602d6541 Vangelis Koukis
[package versions confirmed to be compatible are in braces]
8 bbd4f788 Georgios Gousios
9 602d6541 Vangelis Koukis
- django 1.2 [Django==1.2.4]
10 602d6541 Vangelis Koukis
- simplejson [simplejson==2.1.3]
11 602d6541 Vangelis Koukis
- pycurl [pycurl==7.19.0]
12 602d6541 Vangelis Koukis
- python-dateutil  [python-dateutil==1.4.1]
13 6fc64f55 Georgios Gousios
  WARNING: version python-dateutil==2.0 downloaded by pip known *not* to work
14 6fc64f55 Georgios Gousios
           with Python 2.6
15 9ad94f0a Vassilios Karakoidas
- south [south==0.7.1]
16 ba238ebe Georgios Gousios
- ampqlib [ampqlib==0.6.1]
17 bbd4f788 Georgios Gousios
18 bbd4f788 Georgios Gousios
also, depending on the database engine of choice, on one of the following:
19 602d6541 Vangelis Koukis
- MySQL-python [MySQL-python==1.2.3]
20 602d6541 Vangelis Koukis
- psycopg2 [psycopg2==2.4]
21 f5e590e4 Georgios Gousios
22 ba238ebe Georgios Gousios
to run the user interface tests, selenium must be installed
23 ba238ebe Georgios Gousios
- selenium [?]
24 f5e590e4 Georgios Gousios
25 bbd4f788 Georgios Gousios
Preparing the development environment
26 bbd4f788 Georgios Gousios
-------------------------------------
27 bbd4f788 Georgios Gousios
28 bbd4f788 Georgios Gousios
1. Prepare the system 
29 bbd4f788 Georgios Gousios
The easiest method is to setup a working environment through virtualenv. 
30 bbd4f788 Georgios Gousios
Alternatively, you can use your system's package manager to install
31 bbd4f788 Georgios Gousios
the dependencies (e.g. Macports has them all).
32 bbd4f788 Georgios Gousios
33 6fc64f55 Georgios Gousios
*On Snow Leopard and linux (64-bit), you have to set the following environment
34 6fc64f55 Georgios Gousios
variable for pip to compile the dependencies correctly.
35 bbd4f788 Georgios Gousios
36 bbd4f788 Georgios Gousios
	$export ARCHFLAGS="-arch x86_64"
37 bbd4f788 Georgios Gousios
38 602d6541 Vangelis Koukis
*On Ubuntu, a few more packages must be installed before installing the
39 bbd4f788 Georgios Gousios
prerequisite Python libraries
40 bbd4f788 Georgios Gousios
41 bbd4f788 Georgios Gousios
	$sudo aptitude install libcurl3-gnutls libcurl3-gnutls-dev uuid-dev 
42 bbd4f788 Georgios Gousios
43 bbd4f788 Georgios Gousios
2. Checkout the code and install the Python prerequisites. This assumes
44 bbd4f788 Georgios Gousios
that python is already installed on the host.
45 bbd4f788 Georgios Gousios
46 bbd4f788 Georgios Gousios
    $ sudo easy_install virtualenv
47 bbd4f788 Georgios Gousios
    $ git clone https://user@code.grnet.gr/git/synnefo synnefo
48 bbd4f788 Georgios Gousios
    $ virtualenv --python=python2.6 synnefo --no-site-packages
49 bbd4f788 Georgios Gousios
    ...
50 bbd4f788 Georgios Gousios
    $ cd synnefo
51 602d6541 Vangelis Koukis
    $ ./bin/pip install <list_of_prerequisites>
52 bbd4f788 Georgios Gousios
53 83d51c7b Georgios Gousios
3. At this point you should have all required dependencies installed. Now you
54 bbd4f788 Georgios Gousios
have to select a database engine. The choices are: postgres, mysql and sqlite.
55 bbd4f788 Georgios Gousios
56 bbd4f788 Georgios Gousios
-SQLite
57 bbd4f788 Georgios Gousios
The python sqlite driver is available by default with Python so no additional 
58 bbd4f788 Georgios Gousios
configuration is required. Also, most self-respecting systems have the sqlite 
59 bbd4f788 Georgios Gousios
library installed by default.   
60 bbd4f788 Georgios Gousios
61 bbd4f788 Georgios Gousios
-MySQL
62 bbd4f788 Georgios Gousios
MySQL must be installed first
63 bbd4f788 Georgios Gousios
64 bbd4f788 Georgios Gousios
*Ubuntu - Debian
65 bbd4f788 Georgios Gousios
	$sudo apt-get install libmysqlclient-dev
66 bbd4f788 Georgios Gousios
67 bbd4f788 Georgios Gousios
*MacPorts
68 bbd4f788 Georgios Gousios
	$sudo port install mysql5
69 bbd4f788 Georgios Gousios
70 bbd4f788 Georgios Gousios
Install the MySQL python library
71 bbd4f788 Georgios Gousios
72 bbd4f788 Georgios Gousios
	$ bin/pip install MySQL-python
73 bbd4f788 Georgios Gousios
74 bbd4f788 Georgios Gousios
Note: On MacOSX with Mysql install from MacPorts the above command will fail
75 bbd4f788 Georgios Gousios
complaining that it cannot find the mysql_config command. Do the following and
76 bbd4f788 Georgios Gousios
restart the installation
77 bbd4f788 Georgios Gousios
78 bbd4f788 Georgios Gousios
	$ echo "mysql_config = /opt/local/bin/mysql_config5" >> ./build/MySQL-python/site.cfg
79 bbd4f788 Georgios Gousios
80 bbd4f788 Georgios Gousios
Configure a MySQL db/account for synnefo
81 bbd4f788 Georgios Gousios
82 bbd4f788 Georgios Gousios
	$ mysql -u root -p
83 bbd4f788 Georgios Gousios
84 bbd4f788 Georgios Gousios
	mysql> create database synnefo;
85 bbd4f788 Georgios Gousios
	mysql> show databases;
86 bbd4f788 Georgios Gousios
	mysql> GRANT ALL on synnefo.* TO username IDENTIFIED BY 'password';
87 bbd4f788 Georgios Gousios
 
88 bbd4f788 Georgios Gousios
-Postgres
89 bbd4f788 Georgios Gousios
90 bbd4f788 Georgios Gousios
#Ubuntu - Debian
91 bbd4f788 Georgios Gousios
	$ sudo apt-get install postgresql-8.4 libpq-dev
92 bbd4f788 Georgios Gousios
93 bbd4f788 Georgios Gousios
#MacPorts
94 bbd4f788 Georgios Gousios
	$ sudo port install postgresql84
95 bbd4f788 Georgios Gousios
96 bbd4f788 Georgios Gousios
Install the postgres Python library
97 bbd4f788 Georgios Gousios
98 bbd4f788 Georgios Gousios
	$ bin/pip install psycopg2
99 bbd4f788 Georgios Gousios
100 bbd4f788 Georgios Gousios
Configure a postgres db/account for synnefo
101 7fb0fc9f Vangelis Koukis
	Become the postgres user, connect to PostgreSQL:
102 7fb0fc9f Vangelis Koukis
	$ sudo su - postgres 
103 7fb0fc9f Vangelis Koukis
	$ psql
104 7fb0fc9f Vangelis Koukis
	
105 7fb0fc9f Vangelis Koukis
	Run the following commands:
106 7fb0fc9f Vangelis Koukis
	DROP DATABASE synnefo;
107 7fb0fc9f Vangelis Koukis
	DROP USER username;
108 7fb0fc9f Vangelis Koukis
	CREATE USER username WITH PASSWORD 'password';
109 7fb0fc9f Vangelis Koukis
	CREATE DATABASE synnefo;
110 7fb0fc9f Vangelis Koukis
	GRANT ALL PRIVILEGES ON DATABASE synnefo TO username;
111 7fb0fc9f Vangelis Koukis
	ALTER DATABASE synnefo OWNER TO username;
112 7fb0fc9f Vangelis Koukis
	ALTER USER username CREATEDB;
113 7fb0fc9f Vangelis Koukis
114 7fb0fc9f Vangelis Koukis
The last line enables the newly created user to create own databases. This is
115 7fb0fc9f Vangelis Koukis
needed for Django to create and drop the test_synnefo database for unit
116 7fb0fc9f Vangelis Koukis
testing.
117 bbd4f788 Georgios Gousios
	
118 83d51c7b Georgios Gousios
4. At this point you should have a working DB. Now configure Django to access it: 
119 bbd4f788 Georgios Gousios
Copy the default configuration file 
120 bbd4f788 Georgios Gousios
121 bbd4f788 Georgios Gousios
    $ cp settings.py.dist settings.py
122 bbd4f788 Georgios Gousios
    
123 83d51c7b Georgios Gousios
and then copy/edit according to the database used:  
124 bbd4f788 Georgios Gousios
    
125 bbd4f788 Georgios Gousios
-SQLite
126 bbd4f788 Georgios Gousios
127 bbd4f788 Georgios Gousios
	PROJECT_PATH = os.path.dirname(os.path.abspath(__file__)) + '/'
128 bbd4f788 Georgios Gousios
129 bbd4f788 Georgios Gousios
	DATABASES = {
130 bbd4f788 Georgios Gousios
	    'default': {
131 83d51c7b Georgios Gousios
		'ENGINE': 'django.db.backends.sqlite3',
132 83d51c7b Georgios Gousios
		'NAME': PROJECT_PATH + 'synnefo.db' #WARN: This must be an absolute path
133 bbd4f788 Georgios Gousios
	    }
134 bbd4f788 Georgios Gousios
	}
135 bbd4f788 Georgios Gousios
136 bbd4f788 Georgios Gousios
-MySQL
137 bbd4f788 Georgios Gousios
	DATABASES = {
138 bbd4f788 Georgios Gousios
	    'default': {
139 83d51c7b Georgios Gousios
		'ENGINE': 'django.db.backends.mysql', 
140 bbd4f788 Georgios Gousios
		'NAME': 'synnefo',
141 b6ad19f8 Vassilios Karakoidas
		'USER': 'USERNAME',
142 bbd4f788 Georgios Gousios
		'PASSWORD': 'PASSWORD',
143 bbd4f788 Georgios Gousios
		'HOST': 'HOST',
144 bbd4f788 Georgios Gousios
		'PORT': 'PORT',
145 bbd4f788 Georgios Gousios
		'OPTIONS': {
146 bbd4f788 Georgios Gousios
		    'init_command': 'SET storage_engine=INNODB',
147 bbd4f788 Georgios Gousios
		}
148 bbd4f788 Georgios Gousios
	    }
149 bbd4f788 Georgios Gousios
	}
150 bbd4f788 Georgios Gousios
151 bbd4f788 Georgios Gousios
-Postgres    
152 bbd4f788 Georgios Gousios
153 bbd4f788 Georgios Gousios
    DATABASES = {
154 bbd4f788 Georgios Gousios
	    'default': {
155 83d51c7b Georgios Gousios
		'ENGINE': 'django.db.backends.postgresql_psycopg2',
156 bbd4f788 Georgios Gousios
		'NAME': 'DATABASE',
157 bbd4f788 Georgios Gousios
		'USER': 'USERNAME',
158 bbd4f788 Georgios Gousios
		'PASSWORD': 'PASSWORD',
159 bbd4f788 Georgios Gousios
		'HOST': 'HOST',
160 bbd4f788 Georgios Gousios
		'PORT': 'PORT',
161 bbd4f788 Georgios Gousios
	    }
162 bbd4f788 Georgios Gousios
	}
163 bbd4f788 Georgios Gousios
164 83d51c7b Georgios Gousios
5. Try it out. The following command will attempt to connect to the DB and 
165 bbd4f788 Georgios Gousios
print out DDL statements. It should not fail.
166 bbd4f788 Georgios Gousios
167 bbd4f788 Georgios Gousios
	$ ./bin/python manage.py sql db
168 bbd4f788 Georgios Gousios
	
169 83d51c7b Georgios Gousios
6. Create the DB and (optionally) load test data
170 bbd4f788 Georgios Gousios
    
171 bbd4f788 Georgios Gousios
    $ ./bin/python manage.py syncdb
172 bbd4f788 Georgios Gousios
	$ ./bin/python manage.py loaddata db/fixtures/flavors.json
173 bbd4f788 Georgios Gousios
	$ ./bin/python manage.py loaddata db/fixtures/images.json
174 f5e590e4 Georgios Gousios
175 4cf8adf8 Vangelis Koukis
The following fixtures can be loaded optionally depending on
176 f5e590e4 Georgios Gousios
testing requirements:
177 f5e590e4 Georgios Gousios
178 bbd4f788 Georgios Gousios
	$ ./bin/python manage.py loaddata db/fixtures/vms.json
179 f5e590e4 Georgios Gousios
	$ ./bin/python manage.py loaddata db/fixtures/disks.json
180 83d51c7b Georgios Gousios
181 83d51c7b Georgios Gousios
7. Set the BACKEND_PREFIX_ID variable to some unique prefix, e.g. your commit
182 24435a56 Georgios Gousios
   username in settings.py. Several functional conventions within the system
183 24435a56 Georgios Gousios
   require this variable to include a dash at its end (e.g. snf-)
184 83d51c7b Georgios Gousios
185 7ca9e930 Vangelis Koukis
8. Fix the AMQP-specific settings based on the selected BACKEND_PREFIX_ID.
186 7ca9e930 Vangelis Koukis
   The fix_amqp_settings() function is called once at the end of
187 7ca9e930 Vangelis Koukis
   settings.py.dist, you must call it again if you change BACKEND_PREFIX_ID
188 7ca9e930 Vangelis Koukis
   at some later point.
189 24435a56 Georgios Gousios
190 24435a56 Georgios Gousios
9. Start the system
191 24435a56 Georgios Gousios
    $ ./bin/python logic/dispatcher.py  # DB synch daemon
192 4cf8adf8 Vangelis Koukis
    $ ./bin/python manage.py runserver  # Django
193 f5e590e4 Georgios Gousios
194 24435a56 Georgios Gousios
10. (Hopefully) Done
195 bbd4f788 Georgios Gousios
196 6fc64f55 Georgios Gousios
South Database Migrations
197 9ad94f0a Vassilios Karakoidas
------------------------
198 9ad94f0a Vassilios Karakoidas
199 6d5f3dd2 Vassilios Karakoidas
*Initial Migration
200 6d5f3dd2 Vassilios Karakoidas
201 9ad94f0a Vassilios Karakoidas
First, remember to add the south app to settings.py (it is already included in the
202 9ad94f0a Vassilios Karakoidas
settings.py.dist).
203 9ad94f0a Vassilios Karakoidas
204 55175e78 Vassilios Karakoidas
To initialise south migrations in your database the following commands must be executed:
205 55175e78 Vassilios Karakoidas
206 55175e78 Vassilios Karakoidas
    $ ./bin/python manage.py syncdb       # Create / update the database with the south tables
207 55175e78 Vassilios Karakoidas
    $ ./bin/python manage.py migrate db   # Perform migration in the database
208 55175e78 Vassilios Karakoidas
209 55175e78 Vassilios Karakoidas
Note that syncdb will create the latest models that exist in the db app, so some migrations may fail.
210 55175e78 Vassilios Karakoidas
If you are sure a migration has already taken place you must use the "--fake" option, to apply it.
211 55175e78 Vassilios Karakoidas
212 55175e78 Vassilios Karakoidas
For example:
213 55175e78 Vassilios Karakoidas
214 55175e78 Vassilios Karakoidas
    $ ./bin/python manage.py migrate db 0001 --fake
215 9ad94f0a Vassilios Karakoidas
216 55175e78 Vassilios Karakoidas
To be sure that all migrations are applied type:
217 9ad94f0a Vassilios Karakoidas
218 55175e78 Vassilios Karakoidas
    $ ./bin/python manage.py migrate db --list
219 55175e78 Vassilios Karakoidas
220 55175e78 Vassilios Karakoidas
All starred migrations are applied.
221 55175e78 Vassilios Karakoidas
222 55175e78 Vassilios Karakoidas
Remember, the migration is performed mainly for the data, not for the database schema. If you do not want to migrate the
223 55175e78 Vassilios Karakoidas
data, a syncdb and fake migrations for all the migration versions will suffice.
224 55175e78 Vassilios Karakoidas
225 55175e78 Vassilios Karakoidas
*Schema migrations:
226 55175e78 Vassilios Karakoidas
227 55175e78 Vassilios Karakoidas
Do not use the syncdb management command. It can only be used
228 55175e78 Vassilios Karakoidas
the first time and/or if you drop the database and must recreate it from scratch.
229 55175e78 Vassilios Karakoidas
See "Initial Migration" section.
230 9ad94f0a Vassilios Karakoidas
231 9ad94f0a Vassilios Karakoidas
Each time you make changes to the database and data migration is not required (WARNING: always
232 9ad94f0a Vassilios Karakoidas
perform this with extreme care):
233 9ad94f0a Vassilios Karakoidas
234 9ad94f0a Vassilios Karakoidas
    $ ./bin/python schemamigration db --auto
235 9ad94f0a Vassilios Karakoidas
236 9ad94f0a Vassilios Karakoidas
The above will create the migration script. Now this must be applied to the live database.
237 9ad94f0a Vassilios Karakoidas
238 9ad94f0a Vassilios Karakoidas
    $ ./bin/python migrate db
239 9ad94f0a Vassilios Karakoidas
240 9ad94f0a Vassilios Karakoidas
Consider this example (adding a field to the SynnefoUser model):
241 9ad94f0a Vassilios Karakoidas
242 9ad94f0a Vassilios Karakoidas
    bkarak@nefarian:~/devel/synnefo$ ./bin/python manage.py schemamigration db --auto
243 9ad94f0a Vassilios Karakoidas
     + Added field new_south_test_field on db.SynnefoUser
244 6fc64f55 Georgios Gousios
     Created 0002_auto__add_field_synnefouser_new_south_test_field.py.
245 6fc64f55 Georgios Gousios
246 6fc64f55 Georgios Gousios
  You can now apply this migration with: ./manage.py migrate db
247 6fc64f55 Georgios Gousios
248 d79d8208 Vassilios Karakoidas
    $ ./manage.py migrate db
249 9ad94f0a Vassilios Karakoidas
     Running migrations for db:
250 9ad94f0a Vassilios Karakoidas
     - Migrating forwards to 0002_auto__add_field_synnefouser_new_south_test_field.
251 9ad94f0a Vassilios Karakoidas
     > db:0002_auto__add_field_synnefouser_new_south_test_field
252 9ad94f0a Vassilios Karakoidas
     - Loading initial data for db.
253 9ad94f0a Vassilios Karakoidas
    Installing json fixture 'initial_data' from '/home/bkarak/devel/synnefo/../synnefo/db/fixtures'.
254 9ad94f0a Vassilios Karakoidas
    Installed 1 object(s) from 1 fixture(s)
255 9ad94f0a Vassilios Karakoidas
256 9ad94f0a Vassilios Karakoidas
South needs some extra definitions to the model to preserve and migrate the existing data, for example, if we add a field
257 6fc64f55 Georgios Gousios
in a model, we should declare its default value. If not, South will propably fail, after indicating the error.
258 6fc64f55 Georgios Gousios
259 d79d8208 Vassilios Karakoidas
    $ ./bin/python manage.py schemamigration db --auto
260 d79d8208 Vassilios Karakoidas
     ? The field 'SynnefoUser.new_south_field_2' does not have a default specified, yet is NOT NULL.
261 d79d8208 Vassilios Karakoidas
     ? Since you are adding or removing this field, you MUST specify a default
262 d79d8208 Vassilios Karakoidas
     ? value to use for existing rows. Would you like to:
263 d79d8208 Vassilios Karakoidas
     ?  1. Quit now, and add a default to the field in models.py
264 d79d8208 Vassilios Karakoidas
     ?  2. Specify a one-off value to use for existing columns now
265 d79d8208 Vassilios Karakoidas
     ? Please select a choice: 1
266 6fc64f55 Georgios Gousios
267 6fc64f55 Georgios Gousios
*Data migrations:
268 9ad94f0a Vassilios Karakoidas
269 9ad94f0a Vassilios Karakoidas
If we need to do data migration as well, for example rename a field, we use tha 'datamigration' management command.
270 9ad94f0a Vassilios Karakoidas
271 2e19b161 Vassilios Karakoidas
In contrast with schemamigration, to perform complex data migration, we must write the script manually. The process is
272 2e19b161 Vassilios Karakoidas
the following:
273 2e19b161 Vassilios Karakoidas
274 2e19b161 Vassilios Karakoidas
    1. Introduce the changes in the code and fixtures (initial data).
275 2e19b161 Vassilios Karakoidas
    2. Execute:
276 2e19b161 Vassilios Karakoidas
277 2e19b161 Vassilios Karakoidas
    $ ./bin/python manage.py datamigration <migration_name_here>
278 2e19b161 Vassilios Karakoidas
279 2e19b161 Vassilios Karakoidas
    For example:
280 2e19b161 Vassilios Karakoidas
281 2e19b161 Vassilios Karakoidas
    $ ./bin/python manage.py datamigration db rename_credit_wallet
282 2e19b161 Vassilios Karakoidas
    Created 0003_rename_credit_wallet.py.
283 2e19b161 Vassilios Karakoidas
284 2e19b161 Vassilios Karakoidas
    3. We edit the generated script. It contains two methods: forwards and backwards.
285 2e19b161 Vassilios Karakoidas
286 2e19b161 Vassilios Karakoidas
    For database operations (column additions, alter tables etc) we use the South database API
287 2e19b161 Vassilios Karakoidas
    (http://south.aeracode.org/docs/databaseapi.html).
288 2e19b161 Vassilios Karakoidas
289 d79d8208 Vassilios Karakoidas
    To access the data, we use the database reference (orm) provided as parameter in forwards, backwards method declarations
290 d79d8208 Vassilios Karakoidas
    in the migration script. For example:
291 2e19b161 Vassilios Karakoidas
292 2e19b161 Vassilios Karakoidas
    class Migration(DataMigration):
293 2e19b161 Vassilios Karakoidas
294 2e19b161 Vassilios Karakoidas
    def forwards(self, orm):
295 2e19b161 Vassilios Karakoidas
        orm.SynnefoUser.objects.all()
296 2e19b161 Vassilios Karakoidas
297 2e19b161 Vassilios Karakoidas
    4. To migrate the database to the latest version, we execute:
298 2e19b161 Vassilios Karakoidas
299 2e19b161 Vassilios Karakoidas
    ./manage.py migrate db
300 2e19b161 Vassilios Karakoidas
301 2e19b161 Vassilios Karakoidas
To see which migrations are applied:
302 2e19b161 Vassilios Karakoidas
303 2e19b161 Vassilios Karakoidas
    $ ./bin/python manage.py migrate db --list
304 2e19b161 Vassilios Karakoidas
305 2e19b161 Vassilios Karakoidas
      db
306 2e19b161 Vassilios Karakoidas
        (*) 0001_initial
307 2e19b161 Vassilios Karakoidas
        (*) 0002_auto__add_field_synnefouser_new_south_test_field
308 2e19b161 Vassilios Karakoidas
        (*) 0003_rename_credit_wallet
309 2e19b161 Vassilios Karakoidas
310 2e19b161 Vassilios Karakoidas
More information and more thorough examples can be found in the South web site.
311 2e19b161 Vassilios Karakoidas
312 2e19b161 Vassilios Karakoidas
http://south.aeracode.org/
313 2e19b161 Vassilios Karakoidas
314 bbd4f788 Georgios Gousios
UI Testing
315 bbd4f788 Georgios Gousios
----------
316 83d51c7b Georgios Gousios
The functional ui tests require the Selenium server and the synnefo app to 
317 83d51c7b Georgios Gousios
be running.
318 bbd4f788 Georgios Gousios
319 bbd4f788 Georgios Gousios
    $ wget http://selenium.googlecode.com/files/selenium-server-standalone-2.0b2.jar
320 bbd4f788 Georgios Gousios
    $ java -jar selenium-server-standalone-2.0b2.jar &
321 bbd4f788 Georgios Gousios
    $ ./bin/python manage.py runserver &
322 bbd4f788 Georgios Gousios
    $ ./bin/python manage.py test ui
323 bbd4f788 Georgios Gousios
324 bbd4f788 Georgios Gousios
Test coverage
325 bbd4f788 Georgios Gousios
-------------
326 bbd4f788 Georgios Gousios
327 bbd4f788 Georgios Gousios
In order to get code coverage reports you need to install django-test-coverage
328 bbd4f788 Georgios Gousios
   
329 bbd4f788 Georgios Gousios
   $ ./bin/pip install django-test-coverage
330 bbd4f788 Georgios Gousios
331 bbd4f788 Georgios Gousios
Then edit your settings.py and configure the test runner:
332 bbd4f788 Georgios Gousios
333 bbd4f788 Georgios Gousios
   TEST_RUNNER = 'django-test-coverage.runner.run_tests'