user profile

parent 60fb3c34
......@@ -8,6 +8,7 @@
<script src="{% static 'js/Chart.min.js' %}"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css"/>
<script type="text/javascript" src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
{% endblock %}
{% block messages %}
......@@ -127,7 +128,7 @@
</section>
<section class="content">
<div class="row-fluid">
<div class="row">
{% block profile %}
{% include 'profile.html' %}
{% endblock %}
......@@ -136,9 +137,11 @@
<div class="nav-tabs-custom">
<ul class="nav nav-tabs">
<li class="active"><a href="#timeline" data-toggle="tab">Most Recent</a></li>
<li><a href="#settings" data-toggle="tab">Settings</a></li>
<li><a href="#stats" data-toggle="tab">Stats</a></li>
<!--li><a href="#settings" data-toggle="tab">Settings</a></li-->
</ul>
<div class="tab-content" style="height: 670px">
<div class="tab-content" style="min-height: 668px;">
<div class=" active tab-pane" id="timeline" style="overflow-y:auto; ">
<!-- The timeline -->
<ul class="timeline timeline-inverse">
......@@ -180,6 +183,26 @@
</div>
<!-- /.tab-pane -->
<div class="tab-pane" id="stats">
<div class="chart">
<strong>Today {% now "jS F Y" %}</strong>
<!-- Sales Chart Canvas -->
<div>
<canvas id="salesChart" style="height: 142px; width: 814px;" width="814"
height="142"></canvas>
</div>
</div>
<div>
<hr>
</div>
<div class="container">
<h3 class="box-title" id="purchases_in">Purchases Per Month</h3>
<div id="mostrar">
</div>
</div>
</div>
<div class="tab-pane" id="settings">
<form class="form-horizontal">
<div class="form-group">
......@@ -249,39 +272,7 @@
<!-- /.content -->
<section>
<footer class=" page-footer font-small special-color-dark pt-5">
<!-- Footer Elements -->
<div class="container">
<!-- Social buttons
<ul class="list-unstyled list-inline text-center">
<li class="list-inline-item">
<a class="btn-floating btn-fb mx-1">
<i class="fa fa-faceboo"> </i>
</a>
</li>
<li class="list-inline-item">
<a class="btn-floating btn-tw mx-1">
<i class="fa fa-twitter"> </i>
</a>
</li>
<li class="list-inline-item">
<a class="btn-floating btn-gplus mx-1">
<i class="fa fa-google-plus"> </i>
</a>
</li>
<li class="list-inline-item">
<a class="btn-floating btn-li mx-1">
<i class="fa fa-linkedin"> </i>
</a>
</li>
<li class="list-inline-item">
<a class="btn-floating btn-dribbble mx-1">
<i class="fa fa-dribbble"> </i>
</a>
</li>
</ul>
<!-- Social buttons -->
</div>
<!-- Footer Elements -->
<!-- Copyright -->
<div class="footer-copyright text-center py-3">© 2019 Copyright:
......@@ -362,56 +353,6 @@
});
/*$(document).ready(function () {
var table = $('#example').DataTable
({
"ajax": data,
language:
{
"sProcessing": "Procesando...",
"sLengthMenu": "Mostrar _MENU_ registros",
"sZeroRecords": "No se encontraron resultados",
"sEmptyTable": "Ningún dato disponible en esta tabla",
"sInfo": "Mostrando registros del _START_ al _END_ de un total de _TOTAL_ registros",
"sInfoEmpty": "Mostrando registros del 0 al 0 de un total de 0 registros",
"sInfoFiltered": "(filtrado de un total de _MAX_ registros)",
"sInfoPostFix": "",
"sSearch": "Buscar:",
"sUrl": "",
"sInfoThousands": ",",
"sLoadingRecords": "Cargando...",
"oPaginate":
{
"sFirst": "Primero",
"sLast": "Último",
"sNext": "Siguiente",
"sPrevious": "Anterior"
},
"oAria":
{
"sSortAscending": ": Activar para ordenar la columna de manera ascendente",
"sSortDescending": ": Activar para ordenar la columna de manera descendente"
}
},
responsive:
{
details:
{
type: 'column',
target: 'tr'
}
},
columnDefs:
[{
className: 'control',
orderable: false,
targets: 0
}],
order: [1, 'asc']
});
});*/
// mostrar imagen al dar click en los puntos
document.getElementById("salesChart").onclick = function (evt) {
// activePoints = myChart.getElementsAtEvent(evt);
......@@ -426,44 +367,91 @@
$.ajax({
type: 'POST',
dataType: "json",
data: {'title': label},
url: '../administration/ws/report_table',
data: {'title': label, "user_id": $('#user_id').val()},
url: '../../users/ws/report_table',
success: function (data) {
console.log(data);
$('#mostrar').empty();
$('#mostrar').append("<table class=\"table table-hover\" id=\"example\">" +
"<thead>" +
"<tr>" +
"<th class=\"text-center\">User ID</th>" +
"<th class=\"text-center\">User</th>" +
"<th class=\"text-center\">E-Mail</th>" +
"<th class=\"text-center\">Purchases</th>" +
"<th class=\"text-center\">Storage</th>" +
"<th class=\"text-center\">Downloads in process</th>" +
"<th class=\"text-center\">Zone</th>" +
"<th class=\"text-center\">Process</th>" +
"<th class=\"text-center\">Purchase Date</th>" +
"<th class=\"text-center\">Start Date</th>" +
"<th class=\"text-center\">End Date</th>" +
"</tr>" +
"</thead>" +
"<tbody id=\"tbody\" class=\"text-center\">");
$.each(data, function (key, val) {
$("#tbody").append("<tr>" +
"<td>" + val['user_id'] + "</td>" +
"<td>" + val['username'] + "</td>" +
"<td>" + val['email'] + "</td>" +
"<td>" + val['purchases'] + "</td>" +
"<td>" + val['storage'] + "</td>" +
"<td>" + val['in_process'] + "</td>" +
"<td>" + val['search_name'] + "</td>" +
"<td>" + val['process'] + "</td>" +
"<td>" + val['purchase_date'] + "</td>" +
"<td>" + val['startDate'] + "</td>" +
"<td>" + val['endDate'] + "</td>" +
"</tr>"
);
});
$('#mostrar').append("</tbody>" +
"</table>");
$('#example').DataTable({});
$('#example').DataTable({"pageLength": 5});
}
});
};
var ctx = document.getElementById("salesChart").getContext('2d');
var myChart = new Chart(ctx, {
type: 'line',
data: {
labels: [
{% for dates in dates %}
"{{ dates.date }}",
{% endfor %}
],
datasets: [{
label: 'Sales',
data: [
{% for dates in dates %}
{{ dates.quantity }},
{% endfor %}
],
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
'rgba(54, 162, 235, 0.2)',
'rgba(255, 206, 86, 0.2)',
'rgba(75, 192, 192, 0.2)',
'rgba(153, 102, 255, 0.2)',
'rgba(255, 159, 64, 0.2)'
],
borderColor: [
'rgba(255,99,132,1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255, 1)',
'rgba(255, 159, 64, 1)'
],
borderWidth: 1
}]
},
options: {
scales: {
yAxes: [{
ticks: {
beginAtZero: true
}
}]
}
}
});
</script>
{% endblock %}
\ No newline at end of file
{% load staticfiles %}
{% for data in user_data %}
<div class="col-md-3">
<div class="col-md-3">
{% for data in user_data %}
<!-- Profile Image -->
<div class="box box-primary">
<div class="box-body box-profile">
<br>
<img class="profile-user-img img-responsive img-circle"
src="{% static 'users/images/user_default.png' %}"
alt="User profile picture">
<h3 class="profile-username text-center">{{ data.user_fullname }}</h3>
<input type="hidden" id="user_id" value="{{ data.user_id }}">
<p class="text-muted text-center">Software Engineer</p>
<ul class="list-group list-group-unbordered">
<li class="list-group-item">
<b>Searches</b> <a class="pull-right">{{ data.searches }}</a>
<i class="fa fa-search margin-r-5"></i> <b>Searches</b> <a
class="pull-right">{{ data.searches }}</a>
</li>
<li class="list-group-item">
<b>Purchases</b> <a class="pull-right">{{ data.purchases }}</a>
<i class="fa fa-shopping-cart margin-r-5"></i> <b>Purchases</b> <a
class="pull-right">{{ data.purchases }}</a>
</li>
<li class="list-group-item">
<b>In Process</b> <a class="pull-right">{{ data.in_process }}</a>
<i class="fa fa-download margin-r-5"></i> <b>In Process</b> <a
class="pull-right">{{ data.in_process }}</a>
</li>
<li class="list-group-item">
<i class="fa fa-pie-chart margin-r-5"></i> <b>Disk usage</b> <a
class="pull-right">{{ data.size }}</a>
</li>
</ul>
......@@ -28,50 +37,33 @@
<!-- /.box-body -->
</div>
<!-- /.box -->
{% endfor %}
<div>
<br>
</div>
<!-- About Me Box -->
<div class="box box-primary">
<div class="box-header with-border">
<h3 class="box-title">About Me</h3>
<h3 class="box-title">Searches</h3>
</div>
<!-- /.box-header -->
<div class="box-body">
<strong><i class="fa fa-book margin-r-5"></i> Education</strong>
<p class="text-muted">
B.S. in Computer Science from the University of Tennessee at Knoxville
</p>
<hr>
<strong><i class="fa fa-map-marker margin-r-5"></i> Location</strong>
<p class="text-muted">Malibu, California</p>
<hr>
<strong><i class="fa fa-pencil margin-r-5"></i> Skills</strong>
<p>
<span class="label label-danger">UI Design</span>
<span class="label label-success">Coding</span>
<span class="label label-info">Javascript</span>
<span class="label label-warning">PHP</span>
<span class="label label-primary">Node.js</span>
</p>
<hr>
<strong><i class="fa fa-file-text-o margin-r-5"></i> Notes</strong>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam fermentum enim neque.</p>
<ul class="list-group list-group-unbordered">
{% for data in user_searches %}
<li class="list-group-item">
<i class="fa fa-map-marker margin-r-5"></i> <b>{{ data.search_name }}</b> <a
class="pull-right">{{ data.count }}</a>
</li>
{% endfor %}
</ul>
</div>
<!-- /.box-body -->
</div>
<!-- /.box -->
<div><br></div>
</div>
</div>
{% endfor %}
\ No newline at end of file
......@@ -26,5 +26,6 @@ from users import views
urlpatterns = [
url(r'^$', views.Users, name='users'),
url(r'^(?P<user_id>(\d+))/$', views.User_id, name='user_id'),
url(r'^ws/report_table$', views.wsPurchasesPM, name='wsPurchasesPM'),
]
# + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
import calendar
import os
from django.contrib.auth.models import User
from django.db.models import Count
from django.http import HttpResponse, Http404
from django.shortcuts import render
# Create your views here.
import json
from django.views.decorators.csrf import csrf_exempt
from catalog.models import Search, Purchase
dirname = os.path.dirname(__file__)
configfile = os.path.join(dirname, '../config/config.json')
with open(configfile, 'r') as f:
config = json.load(f)
USERS_PATH = config['PATHS']['PATH_USERS']
#-------------------------------------------
USERS_PATH = config['PATHS']['PATH_NAS']
PATH_USERS = config['PATHS']['PATH_USERS']
size_sentinel = 0
size_repsat = 0
# -------------------------------------------
def Users(request):
user_data = []
user_statics = []
user_searches = []
user = User.objects.get(pk=request.user.id)
searches = Search.objects.filter(user_id=user.id)
......@@ -24,31 +35,40 @@ def Users(request):
purchases = Purchase.objects.filter(user_id=user.id)
in_process = Purchase.objects.filter(user_id=user.id).exclude(progress=100)
bytes_size = 0
for path, directories, files in os.walk(USERS_PATH + "repsat_test_dev/" + user.email):
for filename in files:
bytes_size += os.lstat(os.path.join(path, filename)).st_size
for directory in directories:
bytes_size += os.lstat(os.path.join(path, directory)).st_size
bytes_size += os.path.getsize(USERS_PATH + "repsat_test_dev/" + user.email)
size_repsat = best_unit_size(bytes_size)
user_data.append({
"user_fullname": user.first_name+" "+user.last_name,
"user_id": user.id,
"user_fullname": user.first_name + " " + user.last_name,
"searches": searches.count(),
"purchases": purchases.count(),
"in_process": in_process.count(),
"size": size_repsat,
})
user_statics.append({
"user_fullname": user.first_name + " " + user.last_name,
"searches": searches.count(),
"purchases": purchases.count(),
"in_process": in_process.count(),
for search in Search.objects.values('search_name').filter(user_id=user.id).annotate(
count=Count('search_name')).order_by('-count')[:6]:
user_searches.append({
"search_name": search['search_name'],
"count": search['count'],
})
progress = 0
productList = []
size = 0
folders = []
zip = ""
product_list = Purchase.objects.values('id', 'productList', 'aggreg_date', 'search__clouds', 'search__startDate',
'search__endDate', 'search__process_id__name', 'search__search_name').filter(
user_id=request.user.id, purchased=1).order_by('-aggreg_date')
user_id=user.id, purchased=1).order_by('-aggreg_date')
for producto in product_list:
log_info = USERS_PATH + request.user.email + "/" + str(producto['id']) + "/L2ASCL_AreaProcessing.log"
log_info = PATH_USERS + user.email + "/" + str(producto['id']) + "/L2ASCL_AreaProcessing.log"
#####################################################
# progress bar #
......@@ -66,10 +86,6 @@ def Users(request):
progress = 60
if 'Finalizing...' in open(log_info).read():
progress = 100
# item = Purchase.objects.filter(pk=producto['id'])
# item = Purchase.objects.get(pk=producto['id'])
# item.progress = progress
# item.save()
with open(log_info, 'r') as myfile:
log = myfile.read().replace('\n', '')
......@@ -82,30 +98,6 @@ def Users(request):
else:
final_size = str(round(size, 2)) + " MB"
initial_folder = "."
absolute_path = USERS_PATH + request.user.email + "/" + str(producto['id']) + "/out"
if not os.path.exists(absolute_path):
print("folder out noes not exists")
else:
folders = os.listdir(path=absolute_path)
print(folders)
if len(folders) == 0:
initial_folder = "../#"
else:
initial_folder = folders.pop(0) + "_sclData"
zip_path = USERS_PATH + request.user.email + "/" + str(producto['id'])
# print(zip_path)
# "../ static / reports / tmpImages / repsat_test_dev / umorales @ centrogeo.edu.mx / "+str(producto['id']) / myzip.zip"
wkt = USERS_PATH + request.user.email + "/" + str(producto['id']) + "/findProducts.json"
with open(wkt, 'r') as jsonfile:
polygon = json.load(jsonfile)
for file in os.listdir(path=zip_path):
if file.endswith(".zip"):
zip = zip_path + "/" + file
productList.append({
"search_name": producto['search__search_name'],
"process": producto['search__process_id__name'],
......@@ -114,27 +106,47 @@ def Users(request):
"endDate": producto['search__endDate'],
"clouds": producto['search__clouds'],
"size": final_size,
"purchase_id": producto['id'],
"progress": progress,
"log_info": log,
"initial_folder": initial_folder,
"zip": zip,
"polygon": polygon['wkt'],
})
size = 0
final_size = 0
log_info = ""
progress = 0
initial_folder = ""
zip = ""
wkt = ""
return render(request,'User_profile.html',{"user_data" : user_data, "productList" : productList} )
#----------------------------------------------------------------------
def User_id(request,user_id):
# lista de meses #
month_lst = [
{'quantity': 0, 'date': 'January'},
{'quantity': 0, 'date': 'February'},
{'quantity': 0, 'date': 'March'},
{'quantity': 0, 'date': 'April'},
{'quantity': 0, 'date': 'May'},
{'quantity': 0, 'date': 'June'},
{'quantity': 0, 'date': 'July'},
{'quantity': 0, 'date': 'August'},
{'quantity': 0, 'date': 'September'},
{'quantity': 0, 'date': 'October'},
{'quantity': 0, 'date': 'November'},
{'quantity': 0, 'date': 'December'}]
for date in Purchase.objects.filter(purchased=True, user_id=user.id).extra(
{'month': "Extract(month from aggreg_date)"}).values_list(
'month').annotate(Count('id')):
date_name = calendar.month_name[int(date[0])]
for month in month_lst:
if month['date'] == date_name:
month['quantity'] = date[1]
# print(month_lst)
return render(request, 'User_profile.html', {"user_data": user_data, "productList": productList, "dates": month_lst,
'user_searches': user_searches})
# ----------------------------------------------------------------------
def User_id(request, user_id):
user_data = []
user_statics = []
user_searches = []
user = User.objects.get(pk=user_id)
searches = Search.objects.filter(user_id=user.id)
......@@ -142,31 +154,40 @@ def User_id(request,user_id):
purchases = Purchase.objects.filter(user_id=user.id)
in_process = Purchase.objects.filter(user_id=user.id).exclude(progress=100)
bytes_size = 0
for path, directories, files in os.walk(USERS_PATH + "repsat_test_dev/"+user.email):
for filename in files:
bytes_size += os.lstat(os.path.join(path, filename)).st_size
for directory in directories:
bytes_size += os.lstat(os.path.join(path, directory)).st_size
bytes_size += os.path.getsize(USERS_PATH + "repsat_test_dev/"+user.email)
size_repsat = best_unit_size(bytes_size)
user_data.append({
"user_fullname": user.first_name+" "+user.last_name,
"user_id": user.id,
"user_fullname": user.first_name + " " + user.last_name,
"searches": searches.count(),
"purchases": purchases.count(),
"in_process": in_process.count(),
"size": size_repsat,
})
user_statics.append({
"user_fullname": user.first_name + " " + user.last_name,
"searches": searches.count(),
"purchases": purchases.count(),
"in_process": in_process.count(),
for search in Search.objects.values('search_name').filter(user_id=user.id).annotate(
count=Count('search_name')).order_by('-count')[:6]:
user_searches.append({
"search_name": search['search_name'],
"count": search['count'],
})
progress = 0
productList = []
size = 0
folders = []
zip = ""
product_list = Purchase.objects.values('id', 'productList', 'aggreg_date', 'search__clouds', 'search__startDate',
'search__endDate', 'search__process_id__name', 'search__search_name').filter(
user_id=user.id, purchased=1).order_by('-aggreg_date')
for producto in product_list:
log_info = USERS_PATH + user.email + "/" + str(producto['id']) + "/L2ASCL_AreaProcessing.log"
log_info = PATH_USERS + user.email + "/" + str(producto['id']) + "/L2ASCL_AreaProcessing.log"
#####################################################
# progress bar #
......@@ -184,10 +205,6 @@ def User_id(request,user_id):
progress = 60
if 'Finalizing...' in open(log_info).read():
progress = 100
# item = Purchase.objects.filter(pk=producto['id'])
# item = Purchase.objects.get(pk=producto['id'])
# item.progress = progress
# item.save()
with open(log_info, 'r') as myfile:
log = myfile.read().replace('\n', '')
......@@ -200,30 +217,6 @@ def User_id(request,user_id):
else:
final_size = str(round(size, 2)) + " MB"
initial_folder = "."
absolute_path = USERS_PATH + user.email + "/" + str(producto['id']) + "/out"
if not os.path.exists(absolute_path):
print("folder out noes not exists")
else:
folders = os.listdir(path=absolute_path)
if len(folders) == 0:
initial_folder = "../#"
else:
initial_folder = folders.pop(0) + "_sclData"
zip_path = USERS_PATH + user.email + "/" + str(producto['id'])
# print(zip_path)
# "../ static / reports / tmpImages / repsat_test_dev / umorales @ centrogeo.edu.mx / "+str(producto['id']) / myzip.zip"
wkt = USERS_PATH + user.email + "/" + str(producto['id']) + "/findProducts.json"
with open(wkt, 'r') as jsonfile:
polygon = json.load(jsonfile)
for file in os.listdir(path=zip_path):
if file.endswith(".zip"):
zip = zip_path + "/" + file
productList.append({
"search_name": producto['search__search_name'],
"process": producto['search__process_id__name'],
......@@ -232,19 +225,116 @@ def User_id(request,user_id):
"endDate": producto['search__endDate'],
"clouds": producto['search__clouds'],
"size": final_size,
"purchase_id": producto['id'],
"progress": progress,
"log_info": log,
"initial_folder": initial_folder,
"zip": zip,
"polygon": polygon['wkt'],
})
size = 0
final_size = 0
log_info = ""
progress = 0
initial_folder = ""
zip = ""
wkt = ""
return render(request,'User_profile.html',{"user_data" : user_data, "productList" : productList} )
\ No newline at end of file
# lista de meses #
month_lst = [
{'quantity': 0, 'date': 'January'},
{'quantity': 0, 'date': 'February'},
{'quantity': 0, 'date': 'March'},
{'quantity': 0, 'date': 'April'},
{'quantity': 0, 'date': 'May'},
{'quantity': 0, 'date': 'June'},
{'quantity': 0, 'date': 'July'},
{'quantity': 0, 'date': 'August'},
{'quantity': 0, 'date': 'September'},
{'quantity': 0, 'date': 'October'},
{'quantity': 0, 'date': 'November'},
{'quantity': 0, 'date': 'December'}]
for date in Purchase.objects.filter(purchased=True, user_id=user.id).extra(
{'month': "Extract(month from aggreg_date)"}).values_list(
'month').annotate(Count('id')):
date_name = calendar.month_name[int(date[0])]
for month in month_lst:
if month['date'] == date_name:
month['quantity'] = date[1]
# print(month_lst)
return render(request, 'User_profile.html', {"user_data": user_data, "productList": productList, "dates": month_lst,
'user_searches': user_searches})
# ---------------------------------------------------------
@csrf_exempt
def wsPurchasesPM(request):
if request.is_ajax():
table_data = []
data = Purchase.objects.values('user_id', 'search__endDate', 'search__startDate', 'aggreg_date',
'search__process_id__name', 'search__search_name').filter(
user_id=request.POST.get('user_id'), purchased=True,
aggreg_date__month=to_if(request.POST.get('title'))).order_by('aggreg_date')
for producto in data:
table_data.append({
"search_name": producto['search__search_name'],
"process": producto['search__process_id__name'],
"purchase_date": str(producto['aggreg_date'])[:10],
"startDate": str(producto['search__startDate'])[:10],
"endDate": str(producto['search__endDate'])[:10],
})
return HttpResponse(json.dumps(table_data))
# return HttpResponse({'table_data':table_data})
else:
raise Http404
# ----------------------------------------------------------------------
def to_if(name):
if name == "January":
return 1
elif name == "February":
return 2
elif name == "March":
return 3
elif name == "April":
return 4
elif name == "May":
return 5
elif name == "June":
return 6
elif name == "July":
return 7
elif name == "August":
return 8
elif name == "September":
return 9
elif name == "October":
return 10
elif name == "November":
return 11
elif name == "December":
return 12
else:
raise ValueError
# -----------------------------------------------
def best_unit_size(bytes_size):
"""
Obtenga un tamaño en bytes y conviértalo en el mejor prefijo IEC para facilitar la lectura.
Devuelva un diccionario con tres pares de claves / valores:
"s" - (flotador) Tamaño del camino convertido a la mejor unidad para una fácil lectura
"u" - (str) El prefijo (IEC) para s (de bytes (2 ^ 0) a YiB (2 ^ 80))
"b" - (int / long) El tamaño original en bytes
"""
for exp in range(0, 90, 10):
bu_size = abs(bytes_size) / pow(2.0, exp)
if int(bu_size) < 2 ** 10:
unit = {0: "bytes", 10: "KB", 20: "MB", 30: "GB", 40: "TB", 50: "PB",
60: "EB", 70: "ZB", 80: "YB"}[exp]
break
return str(round(bu_size, 2)) + " " + unit
# ------------------------------------------------
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment