Skip to content

Commit

Permalink
init project
Browse files Browse the repository at this point in the history
  • Loading branch information
Wenyuan Wu committed Sep 28, 2017
1 parent e55341e commit f7e11bb
Show file tree
Hide file tree
Showing 41 changed files with 16,719 additions and 0 deletions.
20 changes: 20 additions & 0 deletions .idea/django-qiniu-fields.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions .idea/inspectionProfiles/profiles_settings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

535 changes: 535 additions & 0 deletions .idea/workspace.xml

Large diffs are not rendered by default.

Empty file added demo/__init__.py
Empty file.
42 changes: 42 additions & 0 deletions demo/adminx.py
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)
5 changes: 5 additions & 0 deletions demo/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from django.apps import AppConfig


class DemoConfig(AppConfig):
name = 'demo'
31 changes: 31 additions & 0 deletions demo/migrations/0001_initial.py
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',
},
),
]
Empty file added demo/migrations/__init__.py
Empty file.
24 changes: 24 additions & 0 deletions demo/models.py
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'
47 changes: 47 additions & 0 deletions demo/qiniu_utils.py
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
10 changes: 10 additions & 0 deletions demo/views.py
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()})
22 changes: 22 additions & 0 deletions manage.py
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)
3 changes: 3 additions & 0 deletions qiniu_fields/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from .fields import QiniuFileField, QiniuFileListField

__all__ = ["QiniuFileField", "QiniuFileListField"]
39 changes: 39 additions & 0 deletions qiniu_fields/fields.py
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)
14 changes: 14 additions & 0 deletions qiniu_fields/forms.py
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)
Binary file not shown.
Binary file not shown.
2 changes: 2 additions & 0 deletions qiniu_fields/static/qiniu_fields/plupload/i18n/en.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions qiniu_fields/static/qiniu_fields/plupload/i18n/zh_CN.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit f7e11bb

Please sign in to comment.