Merge branch 'master' of sika:vtmk/web2.0
This commit is contained in:
@@ -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
@@ -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)
|
||||
|
||||
@@ -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>
|
||||
@@ -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,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");
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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('/',{
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user