216 lines
8.7 KiB
Python
216 lines
8.7 KiB
Python
# coding=utf-8
|
|
import codecs
|
|
|
|
from django.db.models import Count
|
|
from django.shortcuts import render, get_object_or_404, HttpResponseRedirect, HttpResponse
|
|
from django.views.decorators.csrf import csrf_protect
|
|
|
|
from metadata.models import Metadata, Comment, Favorite, Cart, LineItem
|
|
from base.models import Sources, Meteorological, MeteorologicalImage
|
|
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
|
|
from django.contrib import messages
|
|
from django.http import JsonResponse
|
|
from base.models import *
|
|
from django.db.models.functions import TruncMonth, TruncYear
|
|
import csv
|
|
from django.http import StreamingHttpResponse
|
|
|
|
|
|
def index(request):
|
|
category = request.GET.get('category', 1)
|
|
if category == '1':
|
|
metadatas = Metadata.objects.filter(category__name=u'基础地理数据').all().order_by('-hit_count')
|
|
elif category == '2':
|
|
metadatas = Metadata.objects.filter(category__name=u'遥感数据').all().order_by('-hit_count')
|
|
elif category == '3':
|
|
metadatas = Metadata.objects.filter(category__name=u'G214国道').all().order_by('-hit_count')
|
|
elif category == '4':
|
|
metadatas = Metadata.objects.filter(category__name=u'冻土观测基地(旧)').all().order_by('-hit_count')
|
|
elif category == '5':
|
|
metadatas = Metadata.objects.filter(category__name=u'冻土观测基地(新)').all().order_by('-hit_count')
|
|
elif category == '6':
|
|
metadatas = Metadata.objects.filter(category__name=u'施工设计资料').all().order_by('-hit_count')
|
|
else:
|
|
metadatas = Metadata.objects.all().order_by('-hit_count')
|
|
|
|
paginator = Paginator(metadatas, 20)
|
|
page = int(request.GET.get('page', 1))
|
|
try:
|
|
metadatas = paginator.page(page)
|
|
except PageNotAnInteger:
|
|
metadatas = paginator.page(1)
|
|
except EmptyPage:
|
|
metadatas = paginator.page(paginator.num_pages)
|
|
|
|
return render(request, 'metadata/index.html', {'metadatas': metadatas, 'name': category})
|
|
|
|
|
|
def detail(request, metadata_id):
|
|
metadata = get_object_or_404(Metadata, pk=metadata_id)
|
|
metadata.hit_count = metadata.hit_count + 1
|
|
metadata.save()
|
|
|
|
if metadata_id is not None:
|
|
comments = Comment.objects.filter(metadata_id=metadata_id).all().order_by('-created')
|
|
|
|
return render(request, 'metadata/detail.html', {'metadata': metadata, 'comments': comments})
|
|
|
|
|
|
def comment(request):
|
|
if request.method == 'POST':
|
|
meta_id = request.POST.get('meta_id')
|
|
content = request.POST.get('content')
|
|
|
|
if request.user.is_authenticated():
|
|
user_id = request.user.id
|
|
c = Comment()
|
|
c.metadata_id = meta_id
|
|
c.user_id = user_id
|
|
c.content = content
|
|
c.save()
|
|
messages.success(request, u'添加评论成功')
|
|
return HttpResponseRedirect('/metadata/detail/' + meta_id)
|
|
else:
|
|
messages.error(request, u'用户未登录')
|
|
return HttpResponseRedirect('/metadata/detail/' + meta_id)
|
|
|
|
|
|
@csrf_protect
|
|
def favorite(request):
|
|
if request.user.is_authenticated():
|
|
user = request.user
|
|
metadata_id = request.POST.get('metadata_id')
|
|
metadata = get_object_or_404(Metadata, pk=metadata_id)
|
|
favorite = Favorite.objects.filter(metadata=metadata, user=user)
|
|
if not favorite:
|
|
f = Favorite(metadata=metadata, user=user)
|
|
f.save()
|
|
return JsonResponse({"code": 1, "message": u"已成功收藏该数据。"})
|
|
else:
|
|
return JsonResponse({"code": 0, "message": u"请登录,再进行操作。"})
|
|
|
|
|
|
@csrf_protect
|
|
def add_to_cart(request):
|
|
if request.user.is_authenticated():
|
|
user = request.user
|
|
metadata_id = request.POST.get('metadata_id')
|
|
metadata = get_object_or_404(Metadata, pk=metadata_id)
|
|
c = Cart.objects.filter(user=user).first()
|
|
if not c:
|
|
c = Cart(user=user)
|
|
c.save()
|
|
line_item = LineItem.objects.filter(cart=c, metadata=metadata).first()
|
|
|
|
if line_item:
|
|
line_item.quantity += 1
|
|
|
|
else:
|
|
line_item = LineItem(cart=c, metadata=metadata)
|
|
line_item.quantity += 1
|
|
line_item.save()
|
|
|
|
count = LineItem.objects.filter(cart=c).count()
|
|
request.session['count'] = count
|
|
|
|
return JsonResponse({"code": 1, "message": u'已成功添加至购物车。', "count": count})
|
|
else:
|
|
return JsonResponse({"code": 0, "message": u'请登录,再进行操作。'})
|
|
|
|
|
|
def observation(request):
|
|
id = request.GET.get('id')
|
|
metadata = Metadata.objects.get(id=id)
|
|
probeData_y = ProbeData.objects.filter(probe__drilling__section__land__metadata__id=id).annotate(
|
|
year=TruncYear('date')).values('year').annotate(c=Count('id')).values('year', 'c')
|
|
probeData_m = ProbeData.objects.filter(probe__drilling__section__land__metadata__id=id).annotate(
|
|
month=TruncMonth('date')).values('month').annotate(c=Count('id')).values('month', 'c').order_by('-month')
|
|
probeData_all = ProbeData.objects.filter(probe__drilling__section__land__metadata__id=id).order_by('date')[:1]
|
|
print probeData_all
|
|
for p in probeData_all:
|
|
probeData = ProbeData.objects.filter(probe__id=p.probe.id).order_by('date')
|
|
return render(request, 'metadata/observation.html',
|
|
{"metadata": metadata, "probeData": probeData, "probeData_y": probeData_y,
|
|
"probeData_m": probeData_m})
|
|
|
|
|
|
def render_csv(request):
|
|
metadata_id = request.GET.get('metadata')
|
|
metadata = Metadata.objects.get(id=metadata_id)
|
|
year = request.GET.get('year')
|
|
month = request.GET.get('month')
|
|
if year:
|
|
if month:
|
|
results = ProbeData.objects.filter(date__year=year).filter(date__month=month).filter(
|
|
probe__drilling__section__land__metadata__id=metadata_id).select_related('probe', 'probe__drilling',
|
|
'probe__drilling__section',
|
|
'probe__drilling__section__land').order_by('date')
|
|
else:
|
|
results = ProbeData.objects.filter(date__year=year).filter(
|
|
probe__drilling__section__land__metadata__id=metadata_id).select_related('probe', 'probe__drilling',
|
|
'probe__drilling__section',
|
|
'probe__drilling__section__land').order_by('date')
|
|
rows = []
|
|
rhead = ['试验场', '截面', '钻孔', '探头', '时间', '值']
|
|
rows.append(rhead)
|
|
for d in results:
|
|
r = []
|
|
if d.probe.drilling.section.land.name:
|
|
r.append(d.probe.drilling.section.land.name.encode('utf-8'))
|
|
else:
|
|
print "1111", d.probe.drilling.section.land.name
|
|
if d.probe.drilling.section.name:
|
|
r.append(d.probe.drilling.section.name.encode('utf-8'))
|
|
else:
|
|
print "2222", d.probe.drilling.section.name
|
|
if d.probe.drilling.name:
|
|
r.append(d.probe.drilling.name.encode('utf-8'))
|
|
else:
|
|
print "3333", d.probe.drilling.name
|
|
if d.probe.name:
|
|
r.append(d.probe.name.encode('utf-8'))
|
|
else:
|
|
print "4444", d.probe.name
|
|
r.append(d.date)
|
|
r.append(d.value)
|
|
rows.append(r)
|
|
|
|
response = HttpResponse(content_type='text/csv')
|
|
response.write(codecs.BOM_UTF8)
|
|
writer = csv.writer(response)
|
|
for r in rows:
|
|
writer.writerow(r)
|
|
|
|
if year:
|
|
if month:
|
|
filename = str(metadata.id) + '-' + year + '-' + month + '.csv'
|
|
else:
|
|
filename = str(metadata.id) + '-' + year + '.csv'
|
|
response['Content-Disposition'] = u'attachment; filename="%s"' % (filename,)
|
|
return response
|
|
|
|
|
|
def sources(request):
|
|
sources = Sources.objects.filter(land=None)
|
|
return render(request, 'metadata/sources.html', {'sources':sources})
|
|
|
|
|
|
def meteorological(request):
|
|
meteorologicals = Meteorological.objects.all().order_by('-created')
|
|
paginator = Paginator(meteorologicals, 10)
|
|
|
|
p = int(request.GET.get('page', 1))
|
|
try:
|
|
contents = paginator.page(p)
|
|
except PageNotAnInteger:
|
|
contents = paginator.page(1)
|
|
except EmptyPage:
|
|
contents = paginator.page(paginator.num_pages)
|
|
return render(request, 'metadata/meteorological.html', {'contents': contents, 'p': p})
|
|
|
|
def meteorological_details(request):
|
|
id = request.GET.get('id')
|
|
meteorological = Meteorological.objects.get(id=id)
|
|
images = MeteorologicalImage.objects.filter(meteorological__id=id)
|
|
return render(request, 'metadata/meteorological_details.html', { 'm': meteorological, 'images': images})
|