-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
- Loading branch information
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Large diffs are not rendered by default.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
# -*- coding: utf-8 -*- | ||
import xadmin | ||
import xadmin.views as xviews | ||
from xadmin.layout import Main, Fieldset, Side | ||
|
||
from .models import Banner | ||
|
||
|
||
class BaseSetting(object): | ||
enable_themes = True | ||
use_bootswatch = True | ||
|
||
xadmin.site.register(xviews.BaseAdminView, BaseSetting) | ||
|
||
|
||
class AdminSettings(object): | ||
global_search_models = [Banner] | ||
site_title = 'QiniuFields' | ||
site_footer = 'QiniuFields Inc. 2017' | ||
menu_style = 'default' # accordion | ||
|
||
def get_site_menu(self): | ||
return ( | ||
{'title': '内容管理', 'menus': ( | ||
{'title': 'Banner', 'icon': 'fa fa-gift', 'url': self.get_model_url(Banner, 'changelist')}, | ||
)}, | ||
) | ||
|
||
xadmin.site.register(xviews.CommAdminView, AdminSettings) | ||
|
||
|
||
class BannerAdmin(object): | ||
list_display = ('title', 'banner_img', 'created_time') | ||
search_fields = ['title'] | ||
form_layout = ( | ||
Main(Fieldset(u'基本信息', 'title', 'img_url')), | ||
Side(Fieldset(u'其他信息', 'created_time', 'updated_time')) | ||
) | ||
readonly_fields = ('created_time', 'updated_time') | ||
|
||
|
||
xadmin.site.register(Banner, BannerAdmin) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
from django.apps import AppConfig | ||
|
||
|
||
class DemoConfig(AppConfig): | ||
name = 'demo' |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
# -*- coding: utf-8 -*- | ||
# Generated by Django 1.11.5 on 2017-09-28 12:23 | ||
from __future__ import unicode_literals | ||
|
||
from django.db import migrations, models | ||
import qiniu_fields.fields | ||
|
||
|
||
class Migration(migrations.Migration): | ||
|
||
initial = True | ||
|
||
dependencies = [ | ||
] | ||
|
||
operations = [ | ||
migrations.CreateModel( | ||
name='Banner', | ||
fields=[ | ||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||
('title', models.CharField(max_length=100, verbose_name='标题')), | ||
('img_url', qiniu_fields.fields.QiniuFileField(max_length=500, verbose_name='图片')), | ||
('created_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), | ||
('updated_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), | ||
], | ||
options={ | ||
'verbose_name_plural': 'Banner', | ||
'verbose_name': 'Banner', | ||
}, | ||
), | ||
] |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
from django.db import models | ||
from django.utils.html import format_html | ||
|
||
from qiniu_fields import QiniuFileField | ||
|
||
|
||
class Banner(models.Model): | ||
title = models.CharField(max_length=100, verbose_name='标题') | ||
img_url = QiniuFileField(prefix='banner', file_type='image', verbose_name='图片') | ||
created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') | ||
updated_time = models.DateTimeField(auto_now=True, verbose_name='更新时间') | ||
|
||
def __str__(self): | ||
return self.title | ||
|
||
def banner_img(self): | ||
return format_html('<img src="{}" style="height: 45px;"/>', self.img_url) | ||
banner_img.short_description = u'图片' | ||
banner_img.allow_tags = True | ||
|
||
class Meta: | ||
app_label = 'demo' | ||
verbose_name = 'Banner' | ||
verbose_name_plural = 'Banner' |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
# -*- coding: utf-8 -*- | ||
import hashlib | ||
|
||
from django.conf import settings | ||
|
||
from qiniu import Auth, BucketManager, put_file, build_batch_delete | ||
|
||
|
||
EXPIRE_TIME = 24 * 3600 # 1 day | ||
|
||
Q = Auth(settings.QINIU_ACCESS_KEY, settings.QINIU_SECRET_KEY) | ||
|
||
|
||
def get_token(): | ||
token = Q.upload_token(settings.QINIU_BUCKET, expires=EXPIRE_TIME) | ||
return token | ||
|
||
|
||
def delete_data(urls, key_prefix=''): | ||
keys = [] | ||
for url in urls: | ||
if not url.endswith('/'): | ||
url += '/' | ||
key = url.split('/')[-2] | ||
if key_prefix: | ||
key = '%s/%s' % (key_prefix, key) | ||
keys.append(key) | ||
|
||
ops = build_batch_delete(settings.QINIU_BUCKET, keys) | ||
b = BucketManager(Q) | ||
ret, info = b.batch(ops) | ||
print(ret, info) | ||
|
||
|
||
def upload_file(file_data, key_prefix=''): | ||
file_ext = file_data.name.split('.')[-1] | ||
file_name = '.'.join([hashlib.md5(file_data.read()).hexdigest(), file_ext]) | ||
if key_prefix and not key_prefix.endswith('/'): | ||
key_prefix += '/' | ||
key = '%s%s' % (key_prefix, file_name) | ||
token = get_token() | ||
|
||
ret, info = put_file(token, key, file_data.temporary_file_path(), check_crc=False) | ||
if not ret or ret.get('key') != key: | ||
print('fail to upload image to qiniu, info: %s' % info) | ||
|
||
return settings.QINIU_DOMAIN + key |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
#! -*- coding: utf-8 -*- | ||
from django.contrib.auth.decorators import login_required | ||
from django.http import JsonResponse | ||
|
||
from . import qiniu_utils | ||
|
||
|
||
@login_required | ||
def get_qiniu_token(request): | ||
return JsonResponse({'uptoken': qiniu_utils.get_token()}) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
#!/usr/bin/env python | ||
import os | ||
import sys | ||
|
||
if __name__ == "__main__": | ||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "qiniu_fields_demo.settings") | ||
try: | ||
from django.core.management import execute_from_command_line | ||
except ImportError: | ||
# The above import may fail for some other reason. Ensure that the | ||
# issue is really that Django is missing to avoid masking other | ||
# exceptions on Python 2. | ||
try: | ||
import django | ||
except ImportError: | ||
raise ImportError( | ||
"Couldn't import Django. Are you sure it's installed and " | ||
"available on your PYTHONPATH environment variable? Did you " | ||
"forget to activate a virtual environment?" | ||
) | ||
raise | ||
execute_from_command_line(sys.argv) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
from .fields import QiniuFileField, QiniuFileListField | ||
|
||
__all__ = ["QiniuFileField", "QiniuFileListField"] |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
#! -*- coding: utf-8 -*- | ||
from django.db import models | ||
|
||
from .widgets import QiniuFileWidget, QiniuFileListWidget | ||
from .forms import QiniuFileFormField | ||
|
||
|
||
class QiniuFileField(models.URLField): | ||
widget_clz = QiniuFileWidget | ||
form_field_clz = QiniuFileFormField | ||
|
||
def __init__(self, verbose_name=None, name=None, prefix='', file_type='all', **kwargs): | ||
self.prefix = prefix | ||
self.file_type = file_type | ||
kwargs['max_length'] = 500 | ||
super(QiniuFileField, self).__init__(verbose_name, name, **kwargs) | ||
|
||
def formfield(self, **kwargs): | ||
self.form_field_clz.prefix = self.prefix | ||
self.form_field_clz.file_type = self.file_type | ||
kwargs.update({ | ||
'form_class': self.form_field_clz, | ||
'widget': self.widget_clz(attrs={'prefix': self.prefix, 'file_type': self.file_type}) | ||
}) | ||
return super(QiniuFileField, self).formfield(**kwargs) | ||
|
||
|
||
class QiniuFileListField(models.TextField): | ||
|
||
def __init__(self, *args, prefix='', file_type='all', **kwargs): | ||
self.prefix = prefix | ||
self.file_type = file_type | ||
super(QiniuFileListField, self).__init__(*args, **kwargs) | ||
|
||
def formfield(self, **kwargs): | ||
kwargs.update({ | ||
'widget': QiniuFileListWidget(attrs={'prefix': self.prefix, 'file_type': self.file_type}), | ||
}) | ||
return super(QiniuFileListField, self).formfield(**kwargs) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
#! -*- coding: utf-8 -*- | ||
from django import forms | ||
|
||
from .widgets import QiniuFileWidget, QiniuFileListWidget | ||
|
||
|
||
class QiniuFileFormField(forms.URLField): | ||
prefix = '' | ||
file_type = 'all' | ||
widget = QiniuFileWidget | ||
|
||
def __init__(self, *args, **kwargs): | ||
kwargs["widget"] = QiniuFileWidget(attrs={'prefix': self.prefix, 'file_type': self.file_type}) | ||
super(QiniuFileFormField, self).__init__(*args, **kwargs) |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.