admin.py 6.01 KB
from django.contrib import admin
from django.forms import ModelForm, ModelChoiceField
from nested_inlines.admin import NestedModelAdmin, NestedStackedInline, NestedTabularInline

from node.models import NodeType, Language, Node, \
        Project, Corpus, Document, \
        ResourceType, Resource, \
        Ngram, Node_Ngram, Node_Resource

class ResourceInLine(admin.TabularInline):
    model = Resource
    extra = 0

class NgramAdmin(admin.ModelAdmin):
    list_display = ('N', 'Terms')
    search_fields = ('Terms',)

class NodeAdmin(admin.ModelAdmin):
    exclude = ('user', 'path', 'depth', 'numchild', 'ngrams')
    list_display = ('name', 'date')
    search_fields = ('name',)
    # list_filter = ('type',)
    # date_hierarchy
    #inlines = [ResourceInLine,]

    #_nodetype_name = 'Project'
    #_parent_nodetype_name = 'Root'

    def has_change_permission(self, request, obj=None):
        has_class_permission = super(NodeAdmin, self).has_change_permission(request, obj)
        if not has_class_permission:
            return False
        if obj is not None and not request.user.is_superuser and request.user.id != obj.user.id:
            return False
        return True

    def get_queryset(self, request):
        nodeType = NodeType.objects.get(name=self._nodetype_name)
        
        if request.user.is_superuser:
            #return Node.objects.all()
            return Node.objects.filter(type=nodeType)
        
        return Node.objects.filter(user=request.user)

    def save_model(self, request, obj, form, change):
        if not change:
            nodeType        = NodeType.objects.get(name=self._nodetype_name)
            nodeTypeParent  = NodeType.objects.get(name=self._parent_nodetype_name)
            
            try:
                if nodeType.name == 'Project':
                    nodeParent  = Node.objects.get(type = nodeTypeParent, user = request.user)
                else:
                    nodeParent  = Node.objects.create(id = request.POST['parent'])
            except:
                nodeParent  = Node.objects.create(type = nodeTypeParent, user = request.user, name=request.user.username)
            
            obj.user        = request.user
            
            node            = Node.objects.create(type = nodeType,\
                                                parent  = nodeParent,\
                                                user    = request.user,\
                                                name    = obj.name,\
                                                hyperdata= obj.hyperdata,\
                                                )
            
            #nodeParent.save()
            #node.save()
            obj = node
            
        else:
            obj.save()

######################################################################

class ProjectAdmin(NodeAdmin):
    _parent_nodetype_name   = 'Root'
    _nodetype_name          = 'Project'

######################################################################

from django.db.models.query import EmptyQuerySet

class ProjectForm(ModelForm):
    class Meta:
        model = Project
        exclude = ['ngrams', 'hyperdata', 'parent', 'user', 'type', 'language', 'date']

class ResourceForm(ModelForm):
    class Meta:
        model = Resource
        exclude = ['user', 'guid', 'digest']


# for formexample.html
from django import forms

from django.utils.translation import ugettext_lazy as _
class CustomForm(forms.Form):
    type = ModelChoiceField( ResourceType.objects.all() , widget=forms.Select(attrs={'onchange':'CustomForSelect( $("option:selected", this).text() );'}) )
    name = forms.CharField( label='Name', max_length=199 , widget=forms.TextInput(attrs={ 'required': 'true' }))
    file = forms.FileField()

    # Description: clean_file()
    """
        * file_.content_type - Example: ['application/pdf', 'image/jpeg']
        * len(file_) - file size.
            2.5MB - 2621440
            5MB - 5242880
            10MB - 10485760
            20MB - 20971520
            50MB - 5242880
            100MB 104857600
            250MB - 214958080
            500MB - 429916160
    """
    def clean_file(self):
        file_ = self.cleaned_data.get('file')
        # #Filename length
        # if len(file_.name)>30:
        #     from datetime import datetime
        #     file_.name = str(datetime.now().microsecond)
        #     # raise forms.ValidationError(_('Come on dude, name too long. Now is:'+file_.name))
        #File size
        if len(file_)>1024 ** 3:
            raise forms.ValidationError(_('File too heavy! (>1GB).'))
        return file_

class CorpusForm(ModelForm):
    #parent = ModelChoiceField(EmptyQuerySet)
    def __init__(self, *args, **kwargs):
        try:
            self.request = kwargs.pop('request', None)
            super(CorpusForm, self).__init__(*args, **kwargs)
            parent_type = NodeType.objects.get(name="Project")
        except Exception as error:
            print("Error with", error)
    
    class Meta:
        model   = Corpus
        exclude = ['parent', 'user', 'language', 'type', 'ngrams', 'hyperdata', 'date']

class CorpusAdmin(NodeAdmin):
    _parent_nodetype_name = 'Project'
    _nodetype_name = 'Corpus'
    form = CorpusForm

######################################################################

#class DocumentForm(ModelForm):
#    parent = ModelChoiceField(Node.objects.filter(user_id=1, type_id=3))

#class DocumentAdmin(NodeAdmin):
#    _parent_nodetype_name = 'Corpus'
#    _nodetype_name = 'Document'
#    form = DocumentForm
#
class LanguageAdmin(admin.ModelAdmin):
    
    def get_queryset(self, request):
        return Language.objects.filter(implemented=1)
    
    class Meta:
        ordering = ['fullname',]

admin.site.register(Resource)
admin.site.register(ResourceType)
admin.site.register(Language, LanguageAdmin)

admin.site.register(NodeType)
admin.site.register(Project, ProjectAdmin)
admin.site.register(Corpus, CorpusAdmin)
admin.site.register(Document)#, DocumentAdmin)


admin.site.register(Node_Resource)
admin.site.register(Ngram)
admin.site.register(Node_Ngram)