Login

create_model_instances management command

Author:
Lacrymology
Posted:
January 21, 2013
Language:
Python
Version:
1.4
Score:
0 (after 0 ratings)

This management command is run like this: ./manage.py -a someapp filename.cfg

it looks in someapp's directory for a file called /config/filename.cfg with the format explained in the help text, and creates the model instances described in the config file.

It uses the configobj module.

this would be an example config file:

[project.Profile]
[[fields]]
receive_notifications = False
[[children]]
[[[auth.User]]]
[[[[fields]]]]
username = AnnonymousUser
password = ! # set unusable password. There's no way yet to hash and set a given password
email = [email protected]
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
from optparse import make_option
import os
from django.core.management import BaseCommand
import configobj
from django.db.models import get_app, get_model

class Command(BaseCommand):
    """
    Creates django models from config files
    """
    help = """[-a appname ]<config filename>

Create models based on a config file.
The format is:
[<applabel>.<model>]
[[fields]]
field1 = value
field2 = value
[[children]]
[[[<applabel>.<model>]]]
fk_field = <fieldname>
[[[[fields]]]]
field1 = value
field2 = value
"""
    option_list = BaseCommand.option_list + (
        make_option('-a', '--app',
                    action='store',
                    dest='app',
                    default = '<default app label>',
                    help='application to get the config file from'),
        )

    def get_config(self, app_label, config_filename):
        if not config_filename.endswith('.cfg'):
            config_filename += '.cfg'
        app_module = get_app(app_label)
        if hasattr(app_module, '__path__'):
            app_path = app_module.__path__
        else:
            app_path = app_module.__file__
        filename = os.path.join(os.path.dirname(app_path),
                                'config',
                                config_filename)
        return configobj.ConfigObj(filename)

    def create_object(self, model, cfg, parent=None):
        app_label, modelname = model.split('.')
        ModelClass = get_model(app_label, modelname)
        kwargs = {}
        if parent is not None:
            kwargs[cfg['fk_field']] = parent
        kwargs.update(cfg['fields'])
        obj, new = ModelClass.objects.get_or_create(**kwargs)
        if not new:
            self.stdout.write('%s object with fields %s already exists: id %d' % (
                model, str(cfg['fields']), obj.pk))
        return obj

    def handle(self, *args, **options):
        if not args:
            print "The config file is required"
            return
        config = self.get_config(options['app'], args[0])
        for model, cfg in config.items():
            obj = self.create_object(model, cfg)
            for childmodel, ccfg in cfg['children'].items():
                child = self.create_object(childmodel, ccfg, parent=obj)

More like this

  1. Template tag - list punctuation for a list of items by shapiromatron 11 months, 2 weeks ago
  2. JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 11 months, 3 weeks ago
  3. Serializer factory with Django Rest Framework by julio 1 year, 6 months ago
  4. Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 7 months ago
  5. Help text hyperlinks by sa2812 1 year, 8 months ago

Comments

Please login first before commenting.