Beispiel #1
0
 def test_render(self):
     widget = JSONWidget()
     textarea = Textarea()
     for val in [None, '', '{"foo": true}']:
         self.assertEqual(
             widget.render('test', val),
             textarea.render('test', widget.format_value(val), attrs=widget.DEFAULT_ATTRS)
         )
Beispiel #2
0
    def render(self, name, value, attrs=None):
        #print super.render(name, value, attrs)
        textarea = Textarea()
        if 'seo' in name or 'short' in name:
            return textarea.render(name, value, attrs)

        output = []

        output.append(u'<div class="ckeditor" style="float: left;">')
        output.append(textarea.render(name, value, attrs))
        output.append(u'</div>')

        return mark_safe(u''.join(output))
    def render(self, name, value, attrs=None):
        textarea = Textarea.render(self, name, value)

        t = get_template('django_bootstrap_markdown/widget.html')
        c = Context({
            'show_image_button': self.image_control,
            'textarea': textarea,
        })

        return t.render(c)
Beispiel #4
0
 class Meta:
     model = Thread
     fields = ['title', 'body']
     widgets = {
         'body': Textarea(attrs=MD_INPUT),
     }
Beispiel #5
0
 class Meta:
     model = Comment
     fields = ('text', )
     labels = {'text': 'Комментарий'}
     widgets = {'text': Textarea(attrs={"rows": 2})}
Beispiel #6
0
 class Meta:
     model = SQL
     fields = '__all__'
     widgets = {'query': Textarea(attrs={'id': 'query', 'autofocus': True})}
Beispiel #7
0
 class Meta:
     model = ForumPostReply
     fields = ["author", "content"]
     widgets = {
         "content": Textarea(attrs={'width': '100%', 'height': '3em'})
     }
Beispiel #8
0
 class Meta:
     model = Evaluation
     fields = [
         'strength_point',
         'weaknesses',
         'recommendations',
         'director_notes',
         'authority_notes',
         'employeeid',
         'q1',
         'q2',
         'q3',
         'q4',
         'q5',
         'q6',
         'q7',
         'q8',
         'q9',
         'q10',
         'q11',
         'q12',
         'q13',
         'q14',
         'q15',
         'q16',
         'q17',
         'q18',
         'q19',
         'q20',
         'q21',
         'q22',
         'q23',
         'q24',
         'q25',
         'total_group1',
         'total_group2',
         'total_group3',
         'total',
         'is_excellent',
         'is_vergood',
         'is_good',
         'is_fair',
         'is_unacceptable',
     ]
     labels = {
         'strength_point': _('strength point'),
         'weaknesses': _('weaknesses'),
         'recommendations': _('recommendations'),
         'director_notes': _('director notes'),
         'authority_notes': _('authority notes'),
         'employeeid': _('employeeid'),
     }
     widgets = {
         'strength_point':
         Textarea(
             attrs={
                 'class': 'form-control',
                 'placeholder': _('strength point'),
                 'rows': '3',
                 'required': False
             }),
         'weaknesses':
         Textarea(
             attrs={
                 'class': 'form-control',
                 'placeholder': _('weaknesses'),
                 'rows': '3',
                 'required': False
             }),
         'recommendations':
         Textarea(
             attrs={
                 'class': 'form-control',
                 'placeholder': _('recommendations'),
                 'rows': '3',
                 'required': False
             }),
         'director_notes':
         Textarea(
             attrs={
                 'class': 'form-control',
                 'placeholder': _('director_notes'),
                 'rows': '3',
                 'required': False
             }),
         'authority_notes':
         Textarea(
             attrs={
                 'class': 'form-control',
                 'placeholder': _('authority_notes'),
                 'rows': '3',
                 'required': False
             }),
         'employeeid':
         forms.HiddenInput(),
         'q1':
         forms.NumberInput(
             attrs={
                 'ng-model': 'q1',
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True
             }),
         'q2':
         forms.NumberInput(
             attrs={
                 'ng-model': 'q2',
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True
             }),
         'q3':
         forms.NumberInput(
             attrs={
                 'onchange': '',
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True
             }),
         'q4':
         forms.NumberInput(
             attrs={
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True
             }),
         'q5':
         forms.NumberInput(
             attrs={
                 'onchange':
                 "this.value = minmax(this.value, 0, 6);loadData();",
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True
             }),
         'q6':
         forms.NumberInput(
             attrs={
                 'ng-model': 'q6',
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True
             }),
         'q7':
         forms.NumberInput(
             attrs={
                 'ng-model': 'q7',
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True
             }),
         'q8':
         forms.NumberInput(
             attrs={
                 'ng-model': 'q8',
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True
             }),
         'q9':
         forms.NumberInput(
             attrs={
                 'ng-model': 'q9',
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True
             }),
         'q10':
         forms.NumberInput(
             attrs={
                 'ng-model': 'q10',
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True
             }),
         'q11':
         forms.NumberInput(
             attrs={
                 'ng-model': 'q11',
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True
             }),
         'q12':
         forms.NumberInput(
             attrs={
                 'ng-model': 'q12',
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True,
             }),
         'q13':
         forms.NumberInput(
             attrs={
                 'ng-model': 'q13',
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True
             }),
         'q14':
         forms.NumberInput(
             attrs={
                 'ng-model': 'q14',
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True,
             }),
         'q15':
         forms.NumberInput(
             attrs={
                 'ng-model': 'q15',
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True
             }),
         'q16':
         forms.NumberInput(
             attrs={
                 'ng-model': 'q16',
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True
             }),
         'q17':
         forms.NumberInput(
             attrs={
                 'ng-model': 'q17',
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True
             }),
         'q18':
         forms.NumberInput(
             attrs={
                 'ng-model': 'q18',
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True
             }),
         'q19':
         forms.NumberInput(
             attrs={
                 'ng-model': 'q19',
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True
             }),
         'q20':
         forms.NumberInput(
             attrs={
                 'ng-model': 'q20',
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True
             }),
         'q21':
         forms.NumberInput(
             attrs={
                 'ng-model': 'q21',
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True
             }),
         'q22':
         forms.NumberInput(
             attrs={
                 'ng-model': 'q22',
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True
             }),
         'q23':
         forms.NumberInput(
             attrs={
                 'ng-model': 'q23',
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True
             }),
         'q24':
         forms.NumberInput(
             attrs={
                 'ng-model': 'q24',
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True
             }),
         'q25':
         forms.NumberInput(
             attrs={
                 'ng-model': 'q25',
                 'class': 'form-control target',
                 'placeholder': _(''),
                 'required': True
             }),
         'total_group1':
         forms.NumberInput(attrs={
             'class': 'form-control ',
             'placeholder': _('')
         }),
     }
Beispiel #9
0
 class Meta:
     model = Review
     fields = ['user_name', 'rating', 'comment']
     widgets = {'comment': Textarea(attrs={'cols': 40, 'rows': 15})}
Beispiel #10
0
 class ImportForm(BootstrapMixin, Form):
     csv = CSVDataField(fields=fields, required_fields=required_fields, widget=Textarea(attrs=self.widget_attrs))
Beispiel #11
0
 class Meta:
     model = CustomUser
     fields = ['email', 'first_name', 'last_name']
     widgets = {
         'email': Textarea(attrs={'type': 'text'})
     }
Beispiel #12
0
	class Meta:
		model = Books
		exclude = ['user', 'book_name', ]
		widgets = {
			'description': Textarea(attrs={'cols': 50, 'row': 50, 'placeholder': "  *  specify the author of the book \n\n  *  specify the edition of the book\n\n  *  specify the condition of the book \n\n\n\n                                                          max length is 50"})
		}
Beispiel #13
0
from django.utils.html import format_html, mark_safe
from django.contrib.contenttypes.admin import GenericTabularInline
from django.utils.translation import gettext_lazy as _

from reversion.admin import VersionAdmin
import reversion

from . import models

# ---- helper classes ----

# This text override gets used to keep the size down on TextField()s
small_text_overrides = {
    TextField: {
        'widget': Textarea(attrs={
            'rows': 2,
            'cols': 40
        })
    },
}


class HiddenRelatedListFilter(admin.RelatedOnlyFieldListFilter):
    model = None

    def has_output(self):
        return len(self.used_parameters) > 0

    def choices(self, changelist):
        try:
            title = str(
                self.model.objects.get(
Beispiel #14
0
 class Meta:
     model = Record
     fields = ['title', 'username', 'email', 'url', 'password', 'notes']
     widgets = {'notes': Textarea(attrs={'cols': 40, 'rows': 4})}
Beispiel #15
0
 class Meta:
     model = Message
     fields = ('text', 'user_to', 'user_from')
     widgets = {
         'text': Textarea(attrs={'rows': 3}),
     }
Beispiel #16
0
 class Meta:
     model = Comment
     fields = ('text', )
     widgets = {
         'text': Textarea(attrs={'rows': 3}),
     }
Beispiel #17
0
 class Meta:
     model = Comment
     fields = ['comment']
     widgets = {'comment': Textarea(attrs={'rows': 5})}
Beispiel #18
0
	class Meta:
		model = Profile
		fields = ['location','picture','about_player','sport_choose']
		widgets = {'about_player': Textarea(attrs={'cols': 30, 'rows': 5}),}
Beispiel #19
0
 class Meta:
     model = Course
     fields = ['name', 'description']
     widgets = {'description': Textarea(attrs={'rows': 5})}
Beispiel #20
0
class GameForm(ModelForm):
    number_of_players = IntegerField(
        widget=NumberInput(attrs={'class': 'form-control'}),
        validators=[MinValueValidator(1),
                    MaxValueValidator(4)])

    number_of_squares = IntegerField(
        widget=NumberInput(attrs={'class': 'form-control'}),
        validators=[MinValueValidator(1),
                    MaxValueValidator(79)])

    number_of_cards = IntegerField(
        widget=NumberInput(attrs={'class': 'form-control'}),
        validators=[MinValueValidator(1),
                    MaxValueValidator(200)])
    board_sequence = CharField(widget=Textarea(attrs={
        'class': 'form-control',
        'rows': 4
    }),
                               validators=[
                                   MaxLengthValidator(79),
                                   RegexValidator(
                                       regex="^[A-Z]+$",
                                       message="Allowed only uppercase A-Z ")
                               ])

    cards_in_deck = CharField(
        widget=Textarea(attrs={
            'class': 'form-control',
            'rows': 4
        }),
        validators=[
            card_max_value_validator,
            RegexValidator(
                regex="^[A-Z,\s]+$",
                message="Allowed only uppercase A-Z comma and space"),
            card_empty_validator, card_size_validator, two_color_validator
        ])

    class Meta:
        model = GameResult
        fields = [
            "number_of_players", "number_of_squares", "number_of_cards",
            "board_sequence", "cards_in_deck"
        ]

    def clean(self):
        cleaned_data = super(GameForm, self).clean()

        number_of_squares = cleaned_data.get("number_of_squares")
        number_of_cards = cleaned_data.get("number_of_cards")
        board_sequence = cleaned_data.get("board_sequence")
        cards_in_deck = cleaned_data.get("cards_in_deck")

        errors = []

        if board_sequence and number_of_squares != len(board_sequence):
            error = ValidationError(_(
                "Board sequence (%(board_sequence_len)s) does not match number of squares (%(number_of_squares)s)"
            ),
                                    params={
                                        'board_sequence_len':
                                        len(board_sequence),
                                        'number_of_squares': number_of_squares
                                    })
            errors.append(error)

        if cards_in_deck:
            cards_in_deck_len = len(cards_in_deck.split(','))
            if number_of_cards != cards_in_deck_len:
                error = ValidationError(_(
                    "Cards in deck (%(cards_in_deck_len)s) does not match number of cards (%(number_of_cards)s)"
                ),
                                        params={
                                            'cards_in_deck_len':
                                            cards_in_deck_len,
                                            'number_of_cards': number_of_cards
                                        })
                errors.append(error)

        if errors:
            raise ValidationError(errors)

        return cleaned_data

    def save(self, commit=True):
        instance = super(GameForm, self).save(commit=False)

        instance.result = get_game_result(instance.number_of_players,
                                          instance.board_sequence,
                                          instance.cards_in_deck)
        instance.save()
        return instance
Beispiel #21
0
class TaskAdmin(AdminAdvancedFiltersMixin, admin.ModelAdmin):
    list_display = ('number', 'title', 'user', 'partner', 'created_at',
                    'deadline', 'priority', 'state')
    list_display_links = ('number', 'title')
    search_fields = ('id', 'title', 'item__item_description', 'user__username',
                     'user__first_name', 'user__last_name', 'partner__name',
                     'partner__email')
    list_filter = (
        ('user', RelatedDropdownFilter),
        #('partner', RelatedDropdownFilter),
        ('state', UnionFieldListFilter),
        ('priority', UnionFieldListFilter),
        'deadline')
    advanced_filter_fields = (
        'user__username',
        'partner__name',
        'state',
        'priority',
        'deadline',
        'created_at',
        'created_by',
        'title',
        'description',
        'resolution',
    )
    ordering = ('-created_at', )
    readonly_fields = ('created_at', 'last_modified', 'created_by')
    autocomplete_fields = ['user', 'partner']

    fieldsets = (  # Edition form
        (None, {
            'fields': ('title', ('user', 'partner'), 'deadline',
                       ('state', 'priority'), ('description', 'resolution'))
        }),
        (_('More...'), {
            'fields': (('created_at', 'last_modified'), 'created_by'),
            'classes': ('collapse', )
        }),
    )
    inlines = [ItemInline]

    formfield_overrides = {
        models.TextField: {
            'widget': Textarea(attrs={
                'rows': 4,
                'cols': 32
            })
        }
    }

    def get_fieldsets(self, request, obj=None):
        fieldsets = super().get_fieldsets(request, obj)
        if obj is None:
            fieldsets = (  # Creation form
                (None, {
                    'fields': ('title', ('user', 'partner'), 'deadline',
                               ('state', 'priority'), 'description')
                }), )
        return fieldsets

    def save_model(self, request, obj, form, change):
        if change is False:
            obj.created_by = request.user
        super().save_model(request, obj, form, change)
Beispiel #22
0
    class Meta(LRecordForm.Meta):
        model = Record
        fields = [
            'date_from', 'date_to', 'time_from', 'sample_id', 'duration',
            'user', 'wu', 'group', 'project', 'experiment', 'remark'
        ]

        labels = {
            'wu': 'WU:',
            'date_from': 'starting at:',
            'time_from': 'at:',
            'duration': 'Duration in s:',
            'date_to': 'to:',
            'experiment': 'Experiment:',
            'sample_id': 'Sample  ID:'
        }

        help_texts = {
            'date_from': 'The starting date of your run',
            'date_to': 'The end date of your run',
            'duration': 'Enter the run duration in seconds',
            'wu':
            'Number of hours for the run calculated from the seconds and rounded to the tenth',
            'sample_id': 'Unique identifier of your sample',
            'experiment': 'Pick an experiment'
        }

        widgets = {
            'date_from':
            DateInput(attrs={
                'type': 'date',
                'class': 'datepicker dfrom time'
            }),
            'date_to':
            DateInput(attrs={
                'type': 'date',
                'class': 'datepicker dto time'
            }),
            'time_from':
            TimeInput(attrs={
                'type': 'time',
                'class': 'timepicker tfrom time'
            }),
            'duration':
            NumberInput(attrs={
                'min': 0,
                'step': 1,
                'class': 'seconds'
            }),
            'remark':
            Textarea(
                attrs={
                    'placeholder':
                    'Enter some detail here about your experiment',
                    'rows': '1',
                    'cols': '50'
                }),
            'experiment':
            Select(attrs={
                'class': 'experiment',
            }),
            'group':
            Select(attrs={
                'class': 'group',
            }),
            'project':
            Select(attrs={
                'class': 'project',
            }),
            'user':
            Select(attrs={
                'placeholder': 'Surname Name',
                'class': 'user'
            }),
            'wu':
            NumberInput(
                attrs={
                    'required': False,
                    'class': 'uo',
                    'value': 0,
                    'min': 0,
                    'step': 0.5,
                    'style': 'width:10ch'
                }),
        }
Beispiel #23
0
class t_online_info_wait_publish_TophatterAdmin(object):
    downloadxls = True
    import_flag = False
    pt_flag = True

    def show_Picture(self,obj) :
        #url = u'https://contestimg.wish.com/api/webimage/%s-medium.jpg'%str(obj.ProductID)
        try:
            rt =  '<img src="%s"  width="120" height="120"/>  '%(obj.Image)
        except:
            rt = ''
        return mark_safe(rt)
    show_Picture.short_description = u'图片'

    def get_product_ID_link(self,obj) :
        return mark_safe('<a href=https://www.amazon.com/dp/%s>%s</a>'%(obj.ProductID,obj.ProductID))
    get_product_ID_link.short_description = u'产品ID'

    def show_ShopName_Seller(self,obj) :
        rt=''
        rt = u'%s卖家简称:<br>%s<br>店长/销售员:<br>%s'%(rt,obj.ShopName,obj.Seller)
        return mark_safe(rt)
    show_ShopName_Seller.short_description = u'卖家简称/店长/销售员'


    def show_Title_ProductID(self,obj) :
        l = obj.Title.split(' ')
        aa = len(l)
        ll = ''
        rt=''
        logger = logging.getLogger('sourceDns.webdns.views')
        #
        if aa <= 6:
            rt = u'%s标题: %s<br>产品ID: <a href=" https://www.wish.com/c/%s" target="_blank">%s</a>'%(rt,obj.Title,obj.ProductID,obj.ProductID)
        elif aa > 6:
            newe_Title_list = []
            for i in range(0, len(l), 6):
                min_list = ''
                for a in l[i:i+6]:
                    min_list = u'%s%s '%(min_list,a)
                newe_Title_list.append(min_list)
                #logger.error("newe_Title_list===================xxxxxxxxxxxxxxx=%s "%(newe_Title_list))
            for newe_Title  in newe_Title_list:
                ll = u'%s%s<br>'%(ll,newe_Title)
            if len(ll) >= 100:
                rt = u'%s标题:<br><font color="red">%s</font>产品ID:<br><a href=" https://www.wish.com/c/%s" target="_blank">%s</a>'%(rt,ll,obj.ProductID,obj.ProductID)
            else:
                rt = u'%s标题:<br>%s产品ID:<br><a href=" https://www.wish.com/c/%s" target="_blank">%s</a>'%(rt,ll,obj.ProductID,obj.ProductID)
        return mark_safe(rt)
    show_Title_ProductID.short_description = u'标题/产品ID'



    def show_time(self,obj) :
        rt=''
        rt = u'%s刷新时间:<br>%s <br>上架时间:<br>%s <br>最近更新时间:<br>%s'%(rt,obj.RefreshTime,obj.DateUploaded,obj.LastUpdated)
        return mark_safe(rt)
    show_time.short_description = u'时间'

    def show_SKU_list(self,obj) :
        rt='<table   style="text-align:center;" border="1" cellpadding="3" cellspacing="1" bgcolor="#c1c1c1"><tr bgcolor="#C00"><th style="text-align:center">子SKU</th><th style="text-align:center">店铺SKU</th><th style="text-align:center">库存量</th><th style="text-align:center">价格</th></tr>'
        t_online_info_wish_objs = t_online_info_publish_joom.objects.values('SKU','ShopSKU','Quantity','Price').filter(ProductID=obj.ProductID).distinct()
        i = 0
        for t_online_info_wish_obj in t_online_info_wish_objs:
            if i < 5:
                rt = '%s <tr bgcolor="#FFFFFF"><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr> '%(rt,t_online_info_wish_obj['SKU'],t_online_info_wish_obj['ShopSKU'],t_online_info_wish_obj['Quantity'],t_online_info_wish_obj['Price'])
                i = i + 1
        if len(t_online_info_wish_objs)>5:
            rt = '%s<tr><td><a id="link_id_%s">查看更多</a></td></tr>'%(rt,obj.id)
        else:
            rt = rt
        rt = "%s</table><script>$('#link_id_%s').on('click',function(){layer.open({type:2,skin:'layui-layer-lan',title:'查看全部',fix:false,shadeClose: true,maxmin:true,area:['500px','500px'],content:'/t_online_info_wish/SKU/?abc=%s',});});</script>"%(rt,obj.id,obj.ProductID)
        return mark_safe(rt)
    show_SKU_list.short_description = mark_safe('<p align="center"> 子SKU</p>')

    def show_orders7days(self,obj) :

        rt =  "<a id=show_orderlist_%s>日销量</a><script>$('#show_orderlist_%s').on('click',function(){layer.open({type:2,skin:'layui-layer-lan',title:'查看全部',fix:false,shadeClose: true,maxmin:true,area:['1000px','600px'],content:'/t_online_info_wish/order1day/?aID=%s',});});</script>"%(obj.id,obj.id,obj.ProductID)
        #rt = "%s<br><br><br><br>"%(rt)
        #rt = "%s<a href='/Project/admin/skuapp/t_online_info_publish_joom/?_q_=%s'>编辑</a>"%(rt,obj.ProductID)
        return mark_safe(rt)

    show_orders7days.short_description = u'操作'

    #list_per_page=150
    list_display = ('id','show_Picture','show_ShopName_Seller','Orders7Days','OfSales','show_Title_ProductID','show_SKU_list','Status','show_time','show_orders7days')
    list_editable = ('show_Title')
    fields = ('id',)
    #list_filter = ('Seller','Orders7Days','RefreshTime','Status','ReviewState','DateUploaded','LastUpdated',)
    #readonly_fields = ('ProductID','ShopIP','ShopName','Quantity','Orders7Days','ParentSKU','SKU','ShopSKU')
    search_fields = ('id','PlatformName','ProductID','ShopIP','ShopName','Title','SKU','Orders7Days','Status','ReviewState','ParentSKU','Seller',)

    formfield_overrides = {
        models.TextField: {'widget': Textarea(attrs={'rows':5, 'cols':50})},
        }



    #actions = ('to_excel','INSERT_INTO_SCHEDULE1','INSERT_INTO_SCHEDULE2','INSERT_INTO_SCHEDULE3','INSERT_INTO_SCHEDULE4','INSERT_INTO_SCHEDULE5')
    actions = ('to_excel',)       

    def get_list_queryset(self,):
        request = self.request
        qs = super(t_online_info_wait_publish_TophatterAdmin, self).get_list_queryset()
        status = request.GET.get('status')
        st = request.GET.get('st')
        
        if st == 'yy':
            qs = qs.filter(ispublished='已刊登')
        if st == 'nn':
            qs = qs.exclude(ispublished="已刊登")
            if status == 'HedongCloth':
                qs = qs.filter(MainSKU__startswith='M').exclude(Q(MainSKU__startswith='MU')|Q(MainSKU__startswith='MI'))
            elif status == 'bl':
                qs = qs.filter(Q(MainSKU__startswith='BDY')|Q(MainSKU__startswith='BL')|Q(MainSKU__startswith='BRH')|Q(MainSKU__startswith='CFL')|Q(MainSKU__startswith='EAR')|Q(MainSKU__startswith='FAN')|Q(MainSKU__startswith='JA')|Q(MainSKU__startswith='JR')|Q(MainSKU__startswith='KEY')|Q(MainSKU__startswith='NL')|Q(MainSKU__startswith='PD')|Q(MainSKU__startswith='RG'))
            elif status == 'Gadget':
                qs = qs.filter(Q(MainSKU__startswith='HG')|Q(MainSKU__startswith='WS')|Q(MainSKU__startswith='PET')|Q(MainSKU__startswith='WF')|Q(MainSKU__startswith='CAR')|Q(MainSKU__startswith='TL')|Q(MainSKU__startswith='XMA')|Q(MainSKU__startswith='PY'))
            elif status == 'BabyToy':
                qs = qs.filter(Q(MainSKU__startswith='CEA')|Q(MainSKU__startswith='MI')|Q(MainSKU__startswith='TOY')|Q(MainSKU__startswith='SX')|Q(MainSKU__startswith='PA')|Q(MainSKU__startswith='FH')|Q(MainSKU__startswith='SPT')|Q(MainSKU__startswith='WH')|Q(MainSKU__startswith='COA'))
            elif status == 'WomenBeauty':
                qs = qs.filter(Q(MainSKU__startswith='MU')|Q(MainSKU__startswith='NA')|Q(MainSKU__startswith='HHC')|Q(MainSKU__startswith='HA')|Q(MainSKU__startswith='HC')|Q(MainSKU__startswith='HB'))
            elif status == 'CoolBag':
                qs = qs.filter(Q(MainSKU__startswith='BG'))
            elif status == 'BDDecor':
                qs = qs.filter(Q(MainSKU__startswith='Kids')|Q(MainSKU__startswith='SC')|Q(MainSKU__startswith='HT')|Q(MainSKU__startswith='BT')|Q(MainSKU__startswith='SW')|Q(MainSKU__startswith='BET')|Q(MainSKU__startswith='HDR')|Q(MainSKU__startswith='GSH')|Q(MainSKU__startswith='GS')|Q(MainSKU__startswith='SH')|Q(MainSKU__startswith='SK')|Q(MainSKU__startswith='K')|Q(MainSKU__startswith='BB')|Q(MainSKU__startswith='GLV'))
            elif status == 'Shine':
                qs = qs.filter(Q(MainSKU__startswith='BL')|Q(MainSKU__startswith='BRH')|Q(MainSKU__startswith='EAR')|Q(MainSKU__startswith='NL')|Q(MainSKU__startswith='PD')|Q(MainSKU__startswith='RG')|Q(MainSKU__startswith='JA')|Q(MainSKU__startswith='JR')|Q(MainSKU__startswith='FAC')|Q(MainSKU__startswith='Body')|Q(MainSKU__startswith='RING')|Q(MainSKU__startswith='GZSB'))
            elif status == 'Memo':
                qs = qs.filter(Q(MainSKU__startswith='WS')|Q(MainSKU__startswith='XMA')|Q(MainSKU__startswith='PY')|Q(MainSKU__startswith='WDS')|Q(MainSKU__startswith='COA'))
            elif status == 'Liberty':
                qs = qs.filter(Q(MainSKU__startswith='W')|Q(MainSKU__startswith='Bra')).exclude(Q(MainSKU__startswith='WH')|Q(MainSKU__startswith='WF')|Q(MainSKU__startswith='WS'))
            elif status == 'Thunder':
                qs = qs.filter(Q(MainSKU__startswith='OSS')|Q(MainSKU__startswith='CYC')|Q(MainSKU__startswith='BI')|Q(MainSKU__startswith='SPT')|Q(MainSKU__startswith='FH'))
            else:
                qs = qs
                

        return qs

    def to_excel(self, request, queryset):
        from datetime import datetime as datime
        from xlwt import *
        path = MEDIA_ROOT + 'download_xls/' + request.user.username
        #if not os.path.exists(path):
        mkdir_p(MEDIA_ROOT + 'download_xls')
        os.popen('chmod 777 %s'%(MEDIA_ROOT + 'download_xls'))

        mkdir_p(path)
        os.popen('chmod 777 %s'%(path))

        w = Workbook()
        sheet = w.add_sheet('information_deal')
        
        sheet.write(0, 0, u'Unique ID')#SKU
        sheet.write(0, 1, u'Weight')#重量
        sheet.write(0, 2, u'CostPrice')#成本价
        sheet.write(0, 3, u'kc')#库存

        sheet.write(0, 4, u'Product Unique ID') #主SKU
        sheet.write(0, 5, u'Product Category') #类目
        sheet.write(0, 6, u'Product Title') #标题
        sheet.write(0, 7, u'Product Description')#描述
        sheet.write(0, 8, u'Product Condition')#产品状态---NEW
        sheet.write(0, 9, u'Product Brand')#品牌---''
        sheet.write(0, 10, u'Product Material')#材质---''
        sheet.write(0, 11, u'Variation Unique ID')#子SKU
        sheet.write(0, 12, u'Variation Size')#尺寸
        sheet.write(0, 13, u'Variation Color')#颜色
        sheet.write(0, 14, u'Variation Quantity')#数量
        sheet.write(0, 15, u'Starting Bid')#起拍价---'1'
        sheet.write(0, 16, u'Buy Now Price')#价格

        sheet.write(0, 17, u'Retail Price')#折价钱--''
        sheet.write(0, 18, u'Target Price')#拍卖次数--''
        sheet.write(0, 19, u'Shipping Price')#运费
        sheet.write(0, 20, u'Ships From Country')#发货国家--'China'
        sheet.write(0, 21, u'Shipping Weight In Ounces')#--''       


        sheet.write(0, 22, u'Days To Process Order')#备货期---'3'
        sheet.write(0, 23, u'Days To Deliver')#妥投期---'14'
        sheet.write(0, 24, u'Expedited Shipping Price')#---''
        sheet.write(0, 25, u'Expedited Delivery Time')#---''    
        sheet.write(0, 26, u'Buy One Get One Price')#买一送一价格--''
        sheet.write(0, 27, u'Accessory Price')#互补品价格--''
        sheet.write(0, 28, u'Accessory Description')#互补品描述--''
        sheet.write(0, 29, u'Status')#互补品价格--'' 

        sheet.write(0, 30, u'Primary Image URL')#主图
        sheet.write(0, 31, u'Extra Image URL 1')#附图 
        sheet.write(0, 32, u'Extra Image URL 2')#附图 
        sheet.write(0, 33, u'Extra Image URL 3')#附图 
        sheet.write(0, 34, u'Extra Image URL 4')#附图


        #写数据
        row = 0
        for qs in queryset:
            t_online_info_objs = t_online_info_publish_joom.objects.filter(ProductID=qs.ProductID,SKUStatus=0)#.distinct()
            info_objs = t_online_info_objs.values('CostPrice','SKU','Weight','ParentSKU','Title','Description','ShopSKU','Size','Color','Quantity','Price','Shipping','ExtraImages','ProductID',)
            for t_online_info_obj in info_objs:
                try:
                    kc_nid = py_b_goods.objects.filter(SKU=t_online_info_obj['SKU']).values_list('NID',flat=True)[0]
                    if kc_nid == '' or kc_nid is None:
                        kc == 0
                    kc1 = kc_currentstock.objects.filter(GoodsID=kc_nid,StoreID=19).values_list('Number',flat=True)[0]
                    kc2 = kc_currentstock.objects.filter(GoodsID=kc_nid,StoreID=19).values_list('ReservationNum',flat=True)[0]
                    kc = int(kc1)-int(kc2)
                except:
                    kc = ''
                if t_online_info_obj['CostPrice'] is not None and t_online_info_obj['CostPrice'] !='' and float(t_online_info_obj['CostPrice']) <=33 and kc != 0:
                    row = row + 1
                    column = 0
                    sheet.write(row,column,t_online_info_obj['SKU'])
                    
                    column = column + 1
                    sheet.write(row,column,t_online_info_obj['Weight'])
                    
                    column = column + 1
                    sheet.write(row,column,t_online_info_obj['CostPrice'])

                    column = column + 1
                    sheet.write(row,column,kc)

                    column = column + 1
                    sheet.write(row,column,t_online_info_obj['ParentSKU'])

                    column = column + 1
                    sheet.write(row,column,'')
                    
                    column = column + 1
                    sheet.write(row,column,t_online_info_obj['Title'])
                    
                    column = column + 1
                    sheet.write(row,column,t_online_info_obj['Description'])
                    column = column + 1
                    sheet.write(row,column,'New')

                    column = column + 1
                    sheet.write(row,column,'')

                    column = column + 1
                    sheet.write(row,column,'')

                    column = column + 1
                    sheet.write(row,column,t_online_info_obj['ShopSKU'])

                    column = column + 1
                    sheet.write(row,column,t_online_info_obj['Size'])

                    column = column + 1
                    sheet.write(row,column,t_online_info_obj['Color'])

                    column = column + 1
                    sheet.write(row,column,t_online_info_obj['Quantity'])

                    column = column + 1
                    sheet.write(row,column,'1')

                    column = column + 1
                    sheet.write(row,column,t_online_info_obj['Price'])
                    
                    column = column + 1
                    sheet.write(row,column,'')

                    column = column + 1
                    sheet.write(row,column,'')

                    column = column + 1
                    sheet.write(row,column,t_online_info_obj['Shipping'])

                    column = column + 1
                    sheet.write(row,column,'China')
                    column = column + 1
                    sheet.write(row,column,'')
                    column = column + 1
                    sheet.write(row,column,'3')
                    column = column + 1
                    sheet.write(row,column,'14')
                    column = column + 1
                    sheet.write(row,column,'')
                    column = column + 1
                    sheet.write(row,column,'')
                    column = column + 1
                    sheet.write(row,column,'')
                    column = column + 1
                    sheet.write(row,column,'')
                    column = column + 1
                    sheet.write(row,column,'')
                    column = column + 1
                    sheet.write(row,column,'Enabled')

                    column = column + 1
                    try:
                        pp = t_online_info_wait_publish_joom3.objects.filter(ProductID=t_online_info_obj['ProductID']).values_list('Image',flat=True)[0]
                    except:
                        pp=''
                    sheet.write(row,column,pp)

                    #column = column + 1
                    lis=t_online_info_obj['ExtraImages'].split('|')
                    n = 0
                    for i in range(0,len(lis)):
                        column = column + 1
                        sheet.write(row,column,lis[i])
                        n+=1
                        if n == 3:
                            continue
            t_online_info_wait_publish_tophatter.objects.filter(ProductID=qs.ProductID).update(ispublished='已刊登')

        filename = request.user.username + '_' + datime.now().strftime('%Y%m%d%H%M%S') + '.xls'
        w.save(path + '/' +  filename)
        os.popen(r'chmod 777 %s'%(path + '/' +  filename))
        #queryset.update(DealStatus=Dealstatus_obj[0].V,DealStaffID=request.user.username,DealTime=datetime.now())

        #上传oss对象
        auth = oss2.Auth(ACCESS_KEY_ID, ACCESS_KEY_SECRET)
        bucket = oss2.Bucket(auth, ENDPOINT,BUCKETNAME_XLS)
        bucket.create_bucket(oss2.BUCKET_ACL_PUBLIC_READ)
        #删除现有的
        for  object_info in oss2.ObjectIterator(bucket,prefix='%s/%s_'%(request.user.username,request.user.username)):
            bucket.delete_object(object_info.key)
        bucket.put_object(u'%s/%s'%(request.user.username,filename),open(path + '/' +  filename))

        messages.error(request,u'%s%s.%s/%s/%s'%(PREFIX,BUCKETNAME_XLS,ENDPOINT_OUT,request.user.username,filename) + u':成功导出,可点击Download下载到本地~~~~~~' )


    to_excel.short_description = u'导出Excel处理'
Beispiel #24
0
    class Meta:
        model = Persona
        fields = ('nombre', 'apellido', 'email', 'celular', 'usuario',
                  'region', 'contraseña', 'contraseñaconfirmar')
        widgets = {
            'nombre':
            Textarea(
                attrs={
                    'rows': 1,
                    'cols': 30,
                    'style': 'resize:none;',
                    'id': 'nombre',
                    'class': 'form-control',
                    'required onfocus': "setVisibility('100','inline')",
                    'onBlur': "setVisibility('100','none')",
                    'onkeyup': "sync()"
                }),
            'apellido':
            Textarea(
                attrs={
                    'rows': 1,
                    'cols': 30,
                    'style': 'resize:none;',
                    'id': 'apellido',
                    'class': "form-control",
                    'required onfocus': "setVisibility('101','inline')",
                    'onBlur': "setVisibility('101','none')"
                }),
            'email':
            EmailInput(
                attrs={
                    'rows': 1,
                    'cols': 30,
                    'style': 'resize:none;',
                    'id': 'email',
                    'class': "form-control",
                    'required onfocus': "setVisibility('102','inline')",
                    'onBlur': "setVisibility('102','none')",
                    'type': 'email'
                }),
            'celular':
            Textarea(
                attrs={
                    'rows': 1,
                    'cols': 30,
                    'style': 'resize:none;',
                    'id': 'celular',
                    'class': "form-control",
                    'required onfocus': "setVisibility('103','inline')",
                    'onBlur': "setVisibility('103','none')"
                }),
            'usuario':
            Textarea(
                attrs={
                    'rows': 1,
                    'cols': 30,
                    'style': 'resize:none;',
                    'id': 'usuario',
                    'class': "form-control",
                    'required onfocus': "setVisibility('104','inline')",
                    'onBlur': "setVisibility('104','none')"
                }),
            'region':
            Select(
                attrs={
                    'class': "form-control",
                    'onfocus': "setVisibility('105','inline')",
                    'onBlur': "setVisibility('105','none')",
                    'default': "rm"
                }),
            'contraseña':
            PasswordInput(
                attrs={
                    'rows': 1,
                    'cols': 30,
                    'style': 'resize:none;',
                    'id': 'pass',
                    'class': "form-control inputPass",
                    'required onfocus': "setVisibility('106','inline')",
                    'onBlur': "setVisibility('106','none')"
                }),
            'contraseñaconfirmar':
            PasswordInput(
                attrs={
                    'rows': 1,
                    'cols': 30,
                    'style': 'resize:none;',
                    'id': 'passconfirm',
                    'class': "form-control",
                    'required onfocus': "setVisibility('107','inline')",
                    'onBlur': "setVisibility('107','none')"
                }),
        }

        labels = {
            'nombre': _('Nombre'),
            'apellido': _('Apellido'),
            'email': _('Correo Electronico'),
            'celular': _('Numero Telefonico'),
            'usuario': _('Usuario'),
            'region': _('Region'),
            'contraseña': _('Contraseña'),
            'contraseñaconfirmar': _('Confirmar Contraseña'),
        }
class AntibioticResistanceAdminAbstract(admin.ModelAdmin):

    list_display = (
        'antibioticresistance_id',
        'antibioticresistance_name',
    )

    search_fields = [
        'antibioticresistance_id',
        'antibioticresistance_name',
    ]
    readonly_fields = ('antibioticresistance_id', )

    fieldsets = [
        ('', {
            'classes': ('suit-tab suit-tab-antibioticresistance', ),
            'fields': ['antibioticresistance_name']
        }),
    ]
    suit_form_tabs = [(u'antibioticresistance', u'Antibiotic Resistance')]

    #actions = [export_xlsx,]

    formfield_overrides = dict(
        ((models.TextField,
          dict(
              (('widget',
                Textarea(
                    attrs=dict(rows=5, cols=120, style='width: 600px;'))), ))),
         (models.ManyToManyField, dict(
             (('widget', CheckboxSelectMultiple), )))), )

    class Media:
        css = dict(all=['generic.css', 'fixadmin.css'])
        js = ('generic.js', 'models/antibioticresistance.js')

    def get_actions(self, request):
        actions = super(AntibioticResistanceAdminAbstract,
                        self).get_actions(request)

        user = request.user
        #if not user.groups.filter(name=settings.HTML_EXPORTER_PROFILE_GROUP).exists(): del actions['printable_html']
        #if not user.groups.filter(name=settings.EXCEL_EXPORTER_PROFILE_GROUP).exists(): del actions['export_xlsx']
        return actions

    def construct_change_message(self, request, form, formsets, add=False):
        message = super(AntibioticResistanceAdminAbstract,
                        self).construct_change_message(request, form, formsets)
        change_message = []
        if form.changed_data:
            values = []
            for x in form.changed_data:
                field = form.fields[x]
                initial = form.initial.get(x, None)
                value = form.cleaned_data[x]
                if isinstance(field, ModelMultipleChoiceField):
                    value = [int(y.pk) for y in value]
                    initial = [int(y)
                               for y in initial] if initial != None else []

                values.append(_(": %s -> %s" % (str(initial), str(value))))
            change_message.append('%s' % ','.join(values))
            message += ' '.join(change_message)
        return message
Beispiel #26
0
 class Meta:
     model = Comment
     fields = ['author', 'text']
     widgets = {
         'text': Textarea(attrs={'rows': 3}),
     }
Beispiel #27
0
class VolunteerAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.CharField: {
            'widget': TextInput(attrs={'size': '20'})
        },
        models.TextField: {
            'widget': Textarea(attrs={
                'rows': 4,
                'cols': 40
            })
        },
    }
    list_display = ('id', 'supporter_account', 'request_link',
                    'reimbursement_link', 'status', 'skip_reimbursement',
                    'created_date')
    list_display_links = ('id', )
    list_filter = ('status', 'skip_reimbursement')
    list_editable = ('status', 'skip_reimbursement')
    search_fields = ('id', 'supporter__first_name', 'supporter__last_name',
                     'request__requester__first_name',
                     'request__requester__last_name', 'request__id')
    list_per_page = 25
    readonly_fields = ('supporter_account', 'request_link',
                       'reimbursement_link', 'created_date')

    def save_model(self, request, obj, form, change):
        try:
            instance = Request.objects.get(id=obj.request.id)
            instance.volunteer_status = 'Unavailable'
            if obj.status == 'Delivered':
                instance.status = 'Completed'
            else:
                instance.status = 'In Process'
            instance.save()
        except:
            pass
        obj.save()

    def delete_model(self, request, obj):
        try:
            instance = Request.objects.get(id=obj.request.id)
            instance.volunteer_status = 'Available'
            instance.status = 'In Process'
            instance.save()
        except:
            pass
        obj.delete()

    def request_link(self, obj):
        return mark_safe('<a href="{}">{}</a>'.format(
            reverse(
                'admin:%s_%s_change' %
                (obj.request._meta.app_label, obj.request._meta.model_name),
                args=[obj.request.id]), obj.request))

    request_link.short_description = 'Request Info'

    def reimbursement_link(self, obj):
        try:
            reimbursement = Reimbursement.objects.get(volunteer=obj)
            return mark_safe('<a href="{}">{}</a>'.format(
                reverse('admin:%s_%s_change' %
                        (reimbursement._meta.app_label,
                         reimbursement._meta.model_name),
                        args=[reimbursement.id]), reimbursement.status))
        except:
            return None

    reimbursement_link.short_description = 'Reimbursement Info'

    def supporter_account(self, obj):
        return mark_safe('<a href="{}">{}</a>'.format(
            reverse('admin:%s_%s_change' % (obj.supporter._meta.app_label,
                                            obj.supporter._meta.model_name),
                    args=[obj.supporter.id]), obj.supporter))

    supporter_account.short_description = 'Supporter Account'
Beispiel #28
0
 class Meta:
     model = MultipleChoiceQuestion
     fields = [
         'question_num', 'title', 'description', 'a', 'a_is_correct', 'b',
         'b_is_correct', 'c', 'c_is_correct', 'd', 'd_is_correct', 'e',
         'e_is_correct', 'f', 'f_is_correct', 'marks'
     ]
     labels = {
         'question_num': 'Question #',
         'a': 'Option A)',
         'b': 'Option B)',
         'c': 'Option C)',
         'd': 'Option D)',
         'e': 'Option E)',
         'f': 'Option F)',
     }
     widgets = {
         'question_num':
         NumberInput(attrs={
             'class': u'form-control',
             'placeholder': u'Enter Question Number'
         }),
         'title':
         TextInput(attrs={
             'class': u'form-control',
             'placeholder': u'Enter Title'
         }),
         'description':
         Textarea(attrs={
             'class': u'form-control',
             'placeholder': u'Enter Description'
         }),
         'a':
         TextInput(
             attrs={
                 'class': u'form-control',
                 'placeholder': u'Enter Option A Description'
             }),
         'b':
         TextInput(
             attrs={
                 'class': u'form-control',
                 'placeholder': u'Enter Option B Description'
             }),
         'c':
         TextInput(
             attrs={
                 'class': u'form-control',
                 'placeholder': u'Enter Option C Description'
             }),
         'd':
         TextInput(
             attrs={
                 'class': u'form-control',
                 'placeholder': u'Enter Option D Description'
             }),
         'e':
         TextInput(
             attrs={
                 'class': u'form-control',
                 'placeholder': u'Enter Option E Description'
             }),
         'f':
         TextInput(
             attrs={
                 'class': u'form-control',
                 'placeholder': u'Enter Option F Description'
             }),
         'marks':
         NumberInput(attrs={
             'class': u'form-control',
             'placeholder': u'Enter Marks'
         }),
     }
Beispiel #29
0
 def __init__(self, *args, **kwargs):
     super().__init__(*args, **kwargs)
     for field in self.fields:
         self.fields[field].widget.attrs['class'] = 'form-control'
     self.fields['content'].widget = Textarea(attrs={'rows': 5})
Beispiel #30
0
 class Meta:
     model = Message
     fields = ['message']
     widgets = {
         'message': Textarea(attrs={'cols': 60, 'rows': 4}),
     }
Beispiel #31
0
class TestResultAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.TextField: {
            'widget': Textarea(attrs={
                'rows': 3,
                'cols': 40
            })
        },
    }
    list_display = (
        'id',
        'test_name',
        'group',
        'version',
        'test_status',
        'comments',
        'rps',
        'show_test_len',
        'q99',
        'q90',
        'q50',
        'http_errors_perc',
        'net_errors_perc',
        'generator',
        'target',
        'show_graph_url',
        'user',
        'ticket_id',
        'session_id',
        'scenario_path',
    )
    list_display_links = (
        'id',
        'session_id',
    )
    list_filter = (
        'group',
        'test_status',
        'generator',
        'user',
    )
    list_editable = (
        'test_name',
        'test_status',
        'comments',
        'rps',
        'ticket_id',
        'scenario_path',
    )
    list_per_page = 15
    readonly_fields = ('meta', )
    search_fields = (
        'test_name',
        'group',
        'target',
        'scenario_path',
        'ticket_id',
        'session_id',
    )

    def show_graph_url(self, instance):
        return u'<a href="%s">Графики</a>' % (instance.graph_url.decode())

    show_graph_url.allow_tags = True

    def show_test_len(self, instance):
        return str('%s' % (instance.dt_finish - instance.dt_start))
Beispiel #32
0
class ContactForm(Form):
    name = forms.CharField(label=gettext('Name'),max_length=100, widget=TextInput(
        attrs={'class': 'form-control',}
    ))
    email = forms.EmailField(label = gettext('Email'),max_length=100, widget=EmailInput(
        attrs={'class': 'form-control', }
    ))
    phone = forms.CharField(label = gettext('Phone'),max_length=100, widget=TextInput(
        attrs={'class': 'form-control', }
    ))
    message = forms.CharField(label = gettext('Your message to us'),max_length=2000, widget=Textarea(
        attrs={'class': 'form-control', 'rows': '4', }
    ))

    class Meta:
        widgets = {
        }
Beispiel #33
0
 def test_render_required(self):
     widget = Textarea()
     widget.is_required = True
     self.check_html(widget, 'msg', 'value', html='<textarea rows="10" cols="40" name="msg">value</textarea>')
Beispiel #34
0
class BookmarkAdmin(DittoItemModelAdmin):
    list_display = (
        'title',
        'post_time',
        'account',
    )
    list_filter = (
        'post_time',
        'is_private',
        'to_read',
        'account',
    )

    fieldsets = (
        (None, {
            'fields': (
                'account',
                'title',
                'url',
                'description',
                'summary',
                'tags',
                'post_time',
                'post_year_str',
                'url_hash',
            )
        }),
        ('Options', {
            'fields': (
                'is_private',
                'to_read',
            )
        }),
        ('Data', {
            'fields': (
                'raw',
                'fetch_time',
                'time_created',
                'time_modified',
            )
        }),
    )

    formfield_overrides = {
        # Make the inputs full-width.
        models.CharField: {
            'widget': TextInput(attrs={
                'class': 'vLargeTextField',
            })
        },
        # Reduce the number of rows; similar to Pinboard's description field.
        models.TextField: {
            'widget':
            Textarea(attrs={
                'class': 'vLargeTextField',
                'cols': 40,
                'rows': 4,
            })
        },
        # Make the input full-width.
        TaggableManager: {
            'widget': TagWidget(attrs={
                'class': 'vLargeTextField',
            })
        },
    }

    readonly_fields = (
        'post_year_str',
        'raw',
        'fetch_time',
        'time_created',
        'time_modified',
    )
    search_fields = (
        'title',
        'url',
        'description',
    )