Automatically generate admin

  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
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import re
import sys
from django.core.management.base import BaseCommand
from django.db.models.loading import get_models
from django.db import models

LIST_FILTER = (
    models.DateField,
    models.DateTimeField,
    models.ForeignKey,
    models.BooleanField,
)

SEARCH_FIELD = (
    'name',
    'slug',
)

DATE_HIERARCHY = (
    'created_at',
    'updated_at',
    'joined_at',
)

PREPOPULATED_FIELDS = {
    'slug': ('name',)
}

LIST_FILTER_TRESHOLD = 25
RAW_ID_THRESHOLD = 100

class Command(BaseCommand):

    def handle(self, *args, **kwargs):
        self.model_res = []

        installed_apps = dict((a.__name__.rsplit('.', 1)[0], a)
            for a in models.get_apps())

        if not args:
            print >>sys.stderr, 'This command requires a (list of) app(s)'
            for app in sorted(installed_apps):
                print >>sys.stderr, '\t%r' % app
            return

        args = list(args)
        app = installed_apps.get(args.pop(0))
        for arg in args:
            self.model_res.append(re.compile(arg, re.IGNORECASE))

        self.handle_app(app, **kwargs)

    def handle_app(self, app, **options):
        models_dict = {}

        for model in get_models(app):
            name = model.__name__
            field_names = []

            if self.model_res:
                for model_re in self.model_res:
                    if model_re.search(name):
                        break
                else:
                    continue

            models_dict[name] = model_dict = {
                'list_display': [],
                'list_filter': [],
                'raw_id_fields': [],
                'search_fields': [],
                'prepopulated_fields': {},
                'date_hierarchy': None,
            }

            parent_fields = model._meta.parents.values()

            for field in model._meta.local_many_to_many:
                if(field.related.parent_model.objects.all()[:100].count()
                        <= 100):
                    model_dict['raw_id_fields'].append(field.name)

            for field in model._meta.fields:
                if field in parent_fields:
                    continue

                field_names.append(field.name)
                model_dict['list_display'].append(field.name)

                if isinstance(field, LIST_FILTER):
                    if isinstance(field, models.ForeignKey):
                        related_count = (field.related.parent_model.objects
                            .all()
                            [:max(LIST_FILTER_TRESHOLD, RAW_ID_THRESHOLD)]
                            .count()
                        )

                        if related_count >= RAW_ID_THRESHOLD:
                            model_dict['raw_id_fields'].append(field.name)

                        if related_count <= LIST_FILTER_TRESHOLD:
                            model_dict['list_filter'].append(field.name)
                    else:
                        model_dict['list_filter'].append(field.name)

                if field.name in SEARCH_FIELD:
                    model_dict['search_fields'].append(field.name)

            for field_name in DATE_HIERARCHY:
                if field_name in field_names \
                        and not model_dict['date_hierarchy']:
                    model_dict['date_hierarchy'] = field_name

            for k, vs in sorted(PREPOPULATED_FIELDS.iteritems()):
                if field_name in field_names \
                        and not model_dict['date_hierarchy']:
                    model_dict['date_hierarchy'] = field_name

                if k in field_names:
                    incomplete = False
                    for v in vs:
                        if v not in field_names:
                            incomplete = True
                            break

                    if not incomplete:
                        model_dict['prepopulated_fields'][k] = vs

        print 'import models'
        print 'from django.contrib import admin'
        print

        for name, model in sorted(models_dict.iteritems()):
            print '\n\nclass %sAdmin(admin.ModelAdmin):' % name
            for k, v in sorted(model.iteritems()):
                if v:
                    if isinstance(v, (list, set)):
                        v = tuple(v)

                    row = '    %s = %r' % (k, v)
                    row_parts = []
                    while len(row) > 78:
                        pos = row.rfind(' ', 0, 78)
                        row_parts.append(row[:pos])
                        row = '        ' + row[pos:]

                    row_parts.append(row)

                    print '\n'.join(row_parts)

        print '\n\n'
        for name in sorted(models_dict):
            print 'admin.site.register(models.%s, %sAdmin)' % (name, name)

More like this

  1. Link raw_id_fields (both ForeignKeys and ManyToManyFields) to their change pages by EmilStenstrom 2 years, 7 months ago
  2. Automatic slug generation signal by danux 1 year, 10 months ago
  3. Django-admin autoregister -- automatic model registration by Samus_ 2 years, 11 months ago
  4. backupdb command by msaelices 4 years, 10 months ago
  5. YAAS (Yet Another Auto Slug) by carljm 4 years, 12 months ago

Comments

siblek31 (on April 12, 2013):

jika seorang pria yang membuat tips cepat hamil berhala atau sesuatu yang berkaitan dengan penyembahan berhala Tapi dalam kasus seni produk-produk yang dapat digunakan oleh manusia baik untuk baik atau untuk penggunaan jahat. , seperti pedang, panah, dan sejenisnya, praktik seni semacam ini tidak berdosa. ini saja harus disebut seni. "[10] Aquinas soal ulangan sd menyatakan bahwa seni tidak lain dari" alasan yang tepat tentang karya-karya tertentu yang akan dibuat , "dan bahwa itu adalah terpuji, bukan untuk kehendak dengan yang pengrajin yang melakukan pekerjaan," tetapi untuk kualitas pekerjaan. Seni, oleh karena itu, belajar bahasa inggris berbicara dengan benar, adalah kebiasaan operasi. "Aristoteles dan Aquinas membedakannya dari kebiasaan terkait kehati-hatian. [11]

#

siblek31 (on April 13, 2013):

Sebuah sekolah gratis anarkis (juga anarkis sekolah gratis dan sekolah gratis) adalah jaringan desentralisasi di mana keterampilan, informasi, dan pengetahuan dibagi tanpa hierarki atau lingkungan kelembagaan dari sekolah formal. Siswa sekolah gratis mungkin orang dewasa, anak-anak, atau keduanya. Struktur organisasi berbeda dari yang digunakan oleh sekolah-sekolah gratis demokratis yang memungkinkan inisiatif individu anak-anak dan upaya pembelajaran dalam konteks demokrasi kursus bahasa inggris murah sekolah, dimana lagi dan dari pendidikan gratis di mana sekolah 'tradisional' yang tersedia untuk siswa tanpa biaya. Struktur terbuka dari sekolah kursus teknisi komputer gratis ini dimaksudkan untuk mendorong kemandirian, kesadaran kritis, dan pengembangan pribadi. Sekolah bebas sering beroperasi di luar ekonomi pasar yang mendukung ekonomi hadiah. [Rujukan?] Meskipun demikian, makna "bebas" sekolah gratis tidak terbatas pada biaya moneter, dan dapat merujuk pada penekanan pada kebebasan berbicara dan siswa-berpusat pendidikan.

#

(Forgotten your password?)