Merge branch 'master' of sika:vtmk/web2.0

This commit is contained in:
HooVee
2016-08-15 20:30:13 +03:00
10 changed files with 1514 additions and 47 deletions
+12
View File
@@ -88,3 +88,15 @@ POST /members/api/request/:id
//reject member request (== delete request and delete member)
DELETE /members/api/request/:id
// mass import from csv
POST /members/api/csvimport
//csvformat first_name,last_name,email,POR,AYY,JAS
// example data
Pekka,Pöytä,pekka.p.pouta@mosh.pit,Tuska,1,0
// example response on success
{"status": "success", "errors": []}
// example response on failure (code will be 400)
{"status": "failure", "errors": ["failure adding item Pekka, P\u00f6yt\u00e42, pekka.p.pouta@mosh.pit, Tuska, Eip"]}
+27 -1
View File
@@ -1,5 +1,7 @@
from django.db import models
from django.utils import timezone
from io import StringIO
import csv
class Member(models.Model):
'''
@@ -45,9 +47,33 @@ class Member(models.Model):
except KeyError:
pass
self.save()
@classmethod
def import_csv(cls, csv_string):
reader = csv.reader(StringIO(csv_string.strip()))
response = {"status": "success", "errors": []};
try:
data = list(reader)
except ValueError:
return {"status": "failure", "errors": ["could not parse csv file"]}
for row in data:
try:
obj = cls.objects.create(
first_name=row[0],
last_name=row[1],
email=row[2],
POR=row[3],
AYY=row[4].lower() in ['yes','y','1','true',"kyllä", "khyl"],
jas=row[5].lower() in ['yes','y','1','true',"kyllä", "khyl"],
)
print("added obj {}".format(obj))
except:
response["status"] = "failure"
response["errors"].append("failure adding item {}".format(", ".join(row)))
return response
def __str__(self):
return "{} {}".format(first_name, last_name)
return "{} {}".format(self.first_name, self.last_name)
class MemberRequest(models.Model):
member = models.ForeignKey(Member)
-26
View File
@@ -1,26 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>Haku</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<h1>Jäsenrekisteri</h1>
<h2>Hae jäsen</h2>
<p>Syötä jäsenen nimi:</p>
<form role="form">
<div class="form-group">
<label for="usr">Name:</label>
<input type="text" class="form-control" id="usr">
</div>
</f orm>
</div>
</body>
</html>
+6
View File
@@ -0,0 +1,6 @@
var app = angular.module('memberApp', ['ngRoute']);
app.config(['$httpProvider', function ($httpProvider) {
$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
}]);
File diff suppressed because it is too large Load Diff
+11 -7
View File
@@ -11,17 +11,18 @@ app.controller("getController", function($scope, $http, $window, $location){
$scope.delete_member = function(id) {
$http.delete("/members/api/member/" + id).then(
function(response) {
$window.alert("Onnistui! Hyvä Harry!");
noty({ text: "Onnistui! Hyvä Harry!"});
$location.path("#/list");
},
function(response) {
$window.alert("Epäonnistui. Yritä uudelleen.");
noty({ text: "Epäonnistui. Yritä uudelleen."});
$location.path("#/list");
}
);
};
})
.directive('ngConfirmClick',
});
app.directive('ngConfirmClick',
[
function()
{ return {
@@ -38,7 +39,7 @@ function()
}
}}]);
app.controller("postController", function($scope, $http) {
app.controller("postController", function($scope, $http, $location) {
$scope.firstName = "";
$scope.lastName = "";
$scope.email = "";
@@ -46,7 +47,10 @@ app.controller("postController", function($scope, $http) {
$scope.JAS = "";
$scope.POR = "";
$scope.send = function() {
$http.post("/members/api/member/", {"first_name":$scope.firstName, "last_name":$scope.lastName, "email":$scope.email, "AYY":$scope.AYY, "jas":$scope.JAS, "POR":$scope.POR});
$http.post("/members/api/member/", {"first_name":$scope.firstName, "last_name":$scope.lastName, "email":$scope.email, "AYY":$scope.AYY, "jas":$scope.JAS, "POR":$scope.POR}).then(function(data){
noty({ text: "Jäsenhakemus lähetetty"});
$location.path("#/list");
});
}
});
app.controller("editController", function($scope, $http, $route, $routeParams, $window, $location) {
@@ -57,7 +61,7 @@ app.controller("editController", function($scope, $http, $route, $routeParams, $
$scope.send = function() {
$http.put("/members/api/member/"+$scope.member.id, $scope.member).then(function(data){
$window.alert("Jäsentiedot tallennettu");
noty({ text: "Jäsentiedot tallennettu"});
$location.path("#/list");
});
}
-8
View File
@@ -1,11 +1,3 @@
var app = angular.module('memberApp', ['ngRoute']);
app.config(['$httpProvider', function ($httpProvider) {
$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
}]);
app.config(['$routeProvider', function($routeProvider){
$routeProvider
.when('/',{
+5 -4
View File
@@ -10,13 +10,14 @@
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<link href = "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel = "stylesheet">
<script src = "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<link href = "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.css" rel = "stylesheet">
<script src = "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.6/angular.js"></script>
<script src = "http://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-route.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
{%load staticfiles %}
<script src="/static/js/jquery.noty.packaged.js"></script>
<script src="/static/js/appconfig.js"></script>
<script src="/static/js/members_routers.js"></script>
<script src="/static/js/members_controllers.js"></script>
<link href="/static/css/simple-sidebar.css" rel="stylesheet">
@@ -42,6 +43,6 @@
<div ng-view></div>
</div>
</div>
</body>
</html>
+9
View File
@@ -62,6 +62,15 @@ def member_requests(request, *args, **kwargs):
reqs = list(map(lambda r: r.get_dict(),MemberRequest.objects.all()))
return HttpResponse(json.dumps(reqs))
@ensure_csrf_cookie
def csv_import(request, *args, **kwargs):
data = request.body.decode("utf-8")
resp_data = Member.import_csv(data)
resp = HttpResponse(json.dumps(resp_data))
if resp_data['status'] == 'failure':
resp.status_code = 400
return resp
@ensure_csrf_cookie
def new_member_request(request, *args, **kwargs):
try:
+2 -1
View File
@@ -21,6 +21,7 @@ from members.views import index as mindex
from members.views import members as mems
from members.views import member as mem
from members.views import handle_mem_request
from members.views import csv_import as mem_csv_import
from members.views import new_member_request
from members.views import member_requests
@@ -34,7 +35,7 @@ urlpatterns = [
url(r'^members/api/members$', mems),
url(r'^members/api/member/(?P<idx>\d+)$', mem),
url(r'^members/api/member/$', mem),
url(r'^members/api/member/$', mem),
url(r'^members/api/csvimport$', mem_csv_import),
url(r'^members/api/requests$', member_requests),
url(r'^members/api/request$', new_member_request),
url(r'^members/api/request/(?P<idx>\d+)$', handle_mem_request),