Commit 1c14e01a authored by Thodoris Nestoridis's avatar Thodoris Nestoridis

register + bugs

parent 516317e1
...@@ -168,7 +168,7 @@ export class BoilerplateListComponent implements OnInit { ...@@ -168,7 +168,7 @@ export class BoilerplateListComponent implements OnInit {
this.boilerplateService.getAllInfer(this.route.snapshot.params.gb) this.boilerplateService.getAllInfer(this.route.snapshot.params.gb)
.subscribe( .subscribe(
data => { data => {
console.log(data); //console.log(data);
this.currentInfer = data[0]; this.currentInfer = data[0];
this.infer = data; this.infer = data;
if (data[0]) { if (data[0]) {
...@@ -235,7 +235,9 @@ export class BoilerplateListComponent implements OnInit { ...@@ -235,7 +235,9 @@ export class BoilerplateListComponent implements OnInit {
} }
getincreq(): any { getincreq(): any {
return this.get_metrics('IncompleteRequirement').length; if(this.get_metrics('IncompleteRequirement').length>0){
return this.get_metrics('IncompleteRequirement').length;}
else return 0;
} }
} }
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
width: 350px; width: 350px;
height: 250px; height: 250px;
margin-right: 5px; margin-right: 5px;
margin-top: 10px;
} }
.mat-card-content{ .mat-card-content{
height: 100px; height: 100px;
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
<button mat-stroked-button color="primary" class="btn-block" type="submit" (click)="login(email.value, password.value)" >Log in</button> <button mat-stroked-button color="primary" class="btn-block" type="submit" (click)="login(email.value, password.value)" >Log in</button>
<!-- Register --> <!-- Register -->
<p>Not a member? <p>Not a member?
<a href="#">Register</a> <a mat-menu-item (click)="btnRegister()">Register</a>
</p> </p>
</form> </form>
</mat-card> </mat-card>
......
...@@ -40,4 +40,9 @@ export class LoginComponent implements OnInit { ...@@ -40,4 +40,9 @@ export class LoginComponent implements OnInit {
); );
} }
btnRegister () {
this.router.navigate(['signup']);
}
} }
<div style="text-align:center"> <div *ngIf='this.sended' class="alert alert-success" role="alert">Your details have been registered and you will be notified when the user account will be activated</div>
<h1> <div class="main-wrapper" margin fxLayout="row" fxLayoutAlign="center center">
Signup <mat-card class="box">
</h1> <form [formGroup]="form" (ngSubmit)="onSubmit()">
</div> <div class="form-group">
<label>Full Name</label>
<input #username type='text' placeholder='username'> <input
<input #email type='text' placeholder='email'> type="text"
<input #password1 type='password' placeholder='password1'> formControlName="fullname"
<input #password2 type='password' placeholder='password2'> class="form-control"
<button (click)="signup(username.value, email.value, password1.value, password2.value)">signup</button> [ngClass]="{ 'is-invalid': submitted && f.fullname.errors }"
<p>{{ error?.message }}</p> />
<p *ngIf="error">{{ error?.error | json }}</p> <div *ngIf="submitted && f.fullname.errors" class="invalid-feedback">
\ No newline at end of file <div *ngIf="f.fullname.errors.required">Fullname is required</div>
</div>
</div>
<div class="form-group">
<label>Username</label>
<input
type="text"
formControlName="username"
class="form-control"
[ngClass]="{ 'is-invalid': submitted && f.username.errors }"
/>
<div *ngIf="submitted && f.username.errors" class="invalid-feedback">
<div *ngIf="f.username.errors.required">Username is required</div>
<div *ngIf="f.username.errors.minlength">
Username must be at least 6 characters
</div>
<div *ngIf="f.username.errors.maxlength">
Username must not exceed 20 characters
</div>
</div>
</div>
<div class="form-group">
<label>Email</label>
<input
type="text"
formControlName="email"
class="form-control"
[ngClass]="{ 'is-invalid': submitted && f.email.errors }"
/>
<div *ngIf="submitted && f.email.errors" class="invalid-feedback">
<div *ngIf="f.email.errors.required">Email is required</div>
<div *ngIf="f.email.errors.email">Email is invalid</div>
</div>
</div>
<div class="form-group">
<label>Password</label>
<input
type="password"
formControlName="password"
class="form-control"
[ngClass]="{ 'is-invalid': submitted && f.password.errors }"
/>
<div *ngIf="submitted && f.password.errors" class="invalid-feedback">
<div *ngIf="f.password.errors.required">Password is required</div>
<div *ngIf="f.password.errors.minlength">
Password must be at least 8 characters
</div>
<div *ngIf="f.password.errors.maxlength">
Username must not exceed 40 characters
</div>
</div>
</div>
<div class="form-group">
<label>Confirm Password</label>
<input
type="password"
formControlName="confirmPassword"
class="form-control"
[ngClass]="{ 'is-invalid': submitted && f.confirmPassword.errors }"
/>
<div
*ngIf="submitted && f.confirmPassword.errors"
class="invalid-feedback"
>
<div *ngIf="f.confirmPassword.errors.required">
Confirm Password is required
</div>
<div *ngIf="f.confirmPassword.errors.matching">
Confirm Password does not match
</div>
</div>
</div>
<div class="form-group form-check">
<input
type="checkbox"
formControlName="acceptTerms"
class="form-check-input"
[ngClass]="{ 'is-invalid': submitted && f.acceptTerms.errors }"
/>
<label for="acceptTerms" class="form-check-label" matTooltip="Your data will be shared with the team, in order to verify your account." matTooltipPosition="right"
>I have read and agree to the Terms</label
>
<div *ngIf="submitted && f.acceptTerms.errors" class="invalid-feedback" >
Accept Terms is required
</div>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary" [disabled]='this.sended'>Register</button>
<button
type="button"
(click)="onReset()"
class="btn btn-warning float-right"
>
Reset
</button>
</div>
</form>
</mat-card>
</div>
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { AuthService } from './../../services/auth.service';
import { NotifierService } from "angular-notifier";
import { AbstractControl, FormBuilder, FormGroup, Validators, ValidatorFn } from '@angular/forms';
@Component({ @Component({
selector: 'app-signup', selector: 'app-signup',
templateUrl: './singup.component.html', templateUrl: './singup.component.html',
styleUrls: ['./singup.component.scss'] styleUrls: ['./singup.component.scss']
}) })
export class SignupComponent implements OnInit { export class SignupComponent implements OnInit {
private readonly notifier: NotifierService;
constructor(
private authService: AuthService,
private router: Router,
notifierService: NotifierService,
private formBuilder: FormBuilder) {this.notifier = notifierService;}
form = new FormGroup({});
submitted = false;
sended = false;
ngOnInit(): void {
this.form = this.formBuilder.group(
{
fullname: ['', Validators.required],
username: [
'',
[
Validators.required,
Validators.minLength(6),
Validators.maxLength(20)
]
],
email: ['', [Validators.required, Validators.email]],
password: [
'',
[
Validators.required,
Validators.minLength(8),
Validators.maxLength(40)
]
],
confirmPassword: ['', Validators.required],
acceptTerms: [false, Validators.requiredTrue]
},
{
validators: [this.match('password', 'confirmPassword')]
}
);
}
error: any; match(controlName: string, checkControlName: string): ValidatorFn {
return (controls: AbstractControl) => {
const control = controls.get(controlName);
const checkControl = controls.get(checkControlName);
if (checkControl?.errors && !checkControl.errors.matching) {
return null;
}
if (control?.value !== checkControl?.value) {
controls.get(checkControlName)?.setErrors({ matching: true });
return { matching: true };
} else {
return null;
}
};
}
constructor() { } get f(): { [key: string]: AbstractControl } {
return this.form.controls;
ngOnInit() { }
onSubmit(): void {
this.submitted = true
if (this.form.invalid) {
//this.notifier.notify("warning",(JSON.stringify("Invalid form")));
return;
}
this.onSign();
//console.log(JSON.stringify(this.form.value, null, 2));
}
onReset(): void {
this.submitted = false;
this.sended = false;
this.form.reset();
} }
signup(username: string, email: string, password1: string, password2: string) { onSign (){
// TODO: call signup this.authService.signup(this.form.value.fullname, this.form.value.username, this.form.value.email, this.form.value.password, this.form.value.confirmPassword).subscribe(
success => {console.log('SUCCESS');},
error => {console.log(error.statusText);
if (error.statusText == 'OK') {this.sended = true}
else{this.notifier.notify("warning",(JSON.stringify("There might be a problem with your registration. Please try again later.")));}
}
);
} }
} }
<mat-nav-list> <mat-nav-list>
<a mat-list-item routerLink="#" (click)="onSidenavClose()"> <a mat-list-item (click)="LogOut()">
<mat-icon>home</mat-icon> <span class="nav-caption">Home</span> <mat-icon>logout</mat-icon> <span class="nav-caption">Log out</span>
</a> </a>
<a mat-list-item routerLink="#" (click)="onSidenavClose()"> <!-- <a mat-list-item routerLink="#" (click)="onSidenavClose()">
<mat-icon>assignment_ind</mat-icon> <span class="nav-caption">Owner Actions</span> <mat-icon>assignment_ind</mat-icon> <span class="nav-caption">Owner Actions</span>
</a> </a>
<a mat-list-item routerLink="#" (click)="onSidenavClose()"> <a mat-list-item routerLink="#" (click)="onSidenavClose()">
...@@ -15,5 +15,5 @@ ...@@ -15,5 +15,5 @@
<mat-menu #menu="matMenu"> <mat-menu #menu="matMenu">
<button mat-menu-item (click)="onSidenavClose()">View profile</button> <button mat-menu-item (click)="onSidenavClose()">View profile</button>
<button mat-menu-item (click)="onSidenavClose()">Add contact</button> <button mat-menu-item (click)="onSidenavClose()">Add contact</button>
</mat-menu> </mat-menu> -->
</mat-nav-list> </mat-nav-list>
\ No newline at end of file
import { Component, OnInit, Output, EventEmitter } from '@angular/core'; import { Component, OnInit, Output, EventEmitter } from '@angular/core';
import { AuthService } from './../../services/auth.service';
@Component({ @Component({
selector: 'app-sidenav-list', selector: 'app-sidenav-list',
...@@ -8,10 +9,14 @@ import { Component, OnInit, Output, EventEmitter } from '@angular/core'; ...@@ -8,10 +9,14 @@ import { Component, OnInit, Output, EventEmitter } from '@angular/core';
export class SidenavListComponent implements OnInit { export class SidenavListComponent implements OnInit {
@Output() sidenavClose = new EventEmitter(); @Output() sidenavClose = new EventEmitter();
constructor() { } constructor(private authService: AuthService){}
ngOnInit() { ngOnInit() {
} }
public onSidenavClose = () => { public onSidenavClose = () => {
this.sidenavClose.emit(); this.sidenavClose.emit();
} }
LogOut() {
return this.authService.logout();
}
} }
...@@ -17,6 +17,8 @@ import { environment } from '../../environments/environment'; ...@@ -17,6 +17,8 @@ import { environment } from '../../environments/environment';
export class AuthService { export class AuthService {
private apiRoot = environment.apiroot +'auth/'; private apiRoot = environment.apiroot +'auth/';
private baseUrlgb = environment.apiroot+'api-auth/signup/'
constructor(private http: HttpClient, private router:Router) { } constructor(private http: HttpClient, private router:Router) { }
...@@ -45,8 +47,16 @@ export class AuthService { ...@@ -45,8 +47,16 @@ export class AuthService {
); );
} }
signup(username: string, email: string, password1: string, password2: string) { signup(fullname: string, username: string, email: string, password1: string, password2: string) {
// TODO: implement signup
return this.http.post(
this.baseUrlgb,
{ fullname, email, username, password1 }
).pipe(
//tap(response => this.setSession(response)),
tap(response => console.log(response)),
);
} }
logout() { logout() {
......
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# SPARQL HTTP Update, client.
require 'optparse'
require 'net/http'
require 'openssl'
require 'uri'
require 'cgi'
require 'pp'
require 'ostruct'
# ToDo
# Allow a choice of media type for GET
# --accept "content-type" (and abbreviations)
# --header "Add:this"
# --user, --password
# Basic authentication: request.basic_auth("username", "password")
# Follow redirects => 301: puts response["location"] # All headers are lowercase?
SOH_NAME="SOH"
SOH_VERSION="1.0.0"
$proxy = ENV['http_proxy'] ? URI.parse(ENV['http_proxy']) : OpenStruct.new
# What about direct naming?
# Names
$mtTurtle = 'text/turtle;charset=utf-8'
$mtRDF = 'application/rdf+xml'
$mtText = 'text/plain'
$mtNTriples = 'application/n-triples'
$mtNQuads = 'application/n-quads'
$mtJSONLD = 'application/ld+json'
$mtTriG = 'application/trig'
$mtSparqlResultsX = 'application/sparql-results+xml'
$mtSparqlResultsJ = 'application/sparql-results+json'
$mtAppJSON = 'application/json'
$mtAppXML = 'application/xml'
$mtSparqlResultsTSV = 'application/sparql-results+tsv'
$mtSparqlResultsCSV = 'application/sparql-results+csv'
$mtSparqlUpdate = 'application/sparql-update'
$mtWWWForm = 'application/x-www-form-urlencoded'
$mtSparqlQuery = "application/sparql-query" ;
# Global media type table.
$fileMediaTypes = {}
$fileMediaTypes['ttl'] = $mtTurtle
$fileMediaTypes['n3'] = 'text/n3; charset=utf-8'
$fileMediaTypes['nt'] = $mtText
$fileMediaTypes['rdf'] = $mtRDF
$fileMediaTypes['owl'] = $mtRDF
$fileMediaTypes['nq'] = $mtNQuads
$fileMediaTypes['trig'] = $mtTriG
$fileMediaTypes['json-ld'] = $mtJSONLD
$fileMediaTypes['jsonld'] = $mtJSONLD
# Global charset : no entry means "don't set"
$charsetUTF8 = 'utf-8'
$charset = {}
$charset[$mtTurtle] = 'utf-8'
$charset[$mtText] = 'ascii'
$charset[$mtTriG] = 'utf-8'
$charset[$mtNQuads] = 'utf-8'
# Headers
$hContentType = 'Content-Type'
# $hContentEncoding = 'Content-Encoding'
$hContentLength = 'Content-Length'
# $hContentLocation = 'Content-Location'
# $hContentRange = 'Content-Range'
$hAccept = 'Accept'
$hAcceptCharset = 'Accept-Charset'
$hAcceptEncoding = 'Accept-Encoding'
$hAcceptRanges = 'Accept-Ranges'
$headers = { "User-Agent" => "#{SOH_NAME}/Fuseki #{SOH_VERSION}"}
$print_http = false
# Default for GET
# At least allow anything (and hope!)
$accept_rdf="#{$mtTurtle} , #{$mtNTriples};q=0.9 , #{$mtRDF};q=0.8 , #{$mtJSONLD};q=0.5"
# Datasets
$accept_ds="#{$mtTrig} , #{$mtNQuads};q=0.9 , #{$mtJSONLD};q=0.5"
# For SPARQL query
$accept_results="#{$mtSparqlResultsJ} , #{$mtSparqlResultsX};q=0.9 , #{$accept_rdf}"
# Accept any in case of trouble.
$accept_rdf="#{$accept_rdf} , */*;q=0.1"
$accept_results="#{$accept_results} , */*;q=0.1"
# The media type usually forces the charset.
$accept_charset=nil
## Who we are.
## Two styles:
## s-query .....
## soh query .....
$cmd = File.basename($0)
if $cmd == 'soh'
then
$cmd = (ARGV.size == 0) ? 'soh' : ARGV.shift
end
if ! $cmd.start_with?('s-') && $cmd != 'soh'
$cmd = 's-'+$cmd
end
## --------
def GET(dataset, graph)
print "GET #{dataset} #{graph}\n" if $verbose
requestURI = target(dataset, graph)
headers = {}
headers.merge!($headers)
headers[$hAccept] = $accept_rdf
headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
get_worker(requestURI, headers)
end
def get_worker(requestURI, headers)
uri = URI.parse(requestURI)
request = Net::HTTP::Get.new(uri.request_uri)
request.initialize_http_header(headers)
print_http_request(uri, request)
response_print_body(uri, request)
end
def HEAD(dataset, graph)
print "HEAD #{dataset} #{graph}\n" if $verbose
requestURI = target(dataset, graph)
headers = {}
headers.merge!($headers)
headers[$hAccept] = $accept_rdf
headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
uri = URI.parse(requestURI)
request = Net::HTTP::Head.new(uri.request_uri)
request.initialize_http_header(headers)
print_http_request(uri, request)
response_no_body(uri, request)
end
def PUT(dataset, graph, file)
print "PUT #{dataset} #{graph} #{file}\n" if $verbose
send_body(dataset, graph, file, Net::HTTP::Put)
end
def POST(dataset, graph, file)
print "POST #{dataset} #{graph} #{file}\n" if $verbose
send_body(dataset, graph, file, Net::HTTP::Post)
end
def DELETE(dataset, graph)
print "DELETE #{dataset} #{graph}\n" if $verbose
requestURI = target(dataset, graph)
uri = URI.parse(requestURI)
request = Net::HTTP::Delete.new(uri.request_uri)
headers = {}
headers.merge!($headers)
request.initialize_http_header(headers)
print_http_request(uri, request)
response_no_body(uri, request)
end
def uri_escape(string)
CGI.escape(string)
end
def target(dataset, graph)
return dataset+"?default" if graph == "default"
return dataset+"?graph="+uri_escape(graph)
end
def send_body(dataset, graph, file, method)
mt = content_type(file)
if mt.nil?
warn_exit "Can't identify the content type of '#{file}'", 9
end
headers = {}
headers.merge!($headers)
headers[$hContentType] = mt
headers[$hContentLength] = File.size(file).to_s
## p headers
requestURI = target(dataset, graph)
uri = URI.parse(requestURI)
request = method.new(uri.request_uri)
request.initialize_http_header(headers)
print_http_request(uri, request)
request.body_stream = File.open(file)
response_no_body(uri, request)
end
def response_no_body(uri, request)
http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
http.read_timeout = nil
if uri.scheme == 'https'
http.use_ssl = uri.scheme == 'https'
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
end
begin http.start do |http|
response = http.request(request)
print_http_response(response)
case response
when Net::HTTPSuccess, Net::HTTPRedirection
# OK
when Net::HTTPNotFound
warn_exit "404 Not found: #{uri}", 9
#print response.body
else
warn_exit "#{response.code} #{response.message} #{uri}", 9
# Unreachable
response.error!
end
end
rescue Exception => e
# puts e.message
#puts e.backtrace.inspect
warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
end
end
def response_print_body(uri, request)
http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
if uri.scheme == 'https'
http.use_ssl = uri.scheme == 'https'
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
end
begin http.start do |http|
# Add a blank line if headers were output.
print "\n" if $http_print ;
response = http.request(request) { |res|
print_http_response(res)
#puts res.code
res.read_body do |segment|
print segment
end
}
case response
when Net::HTTPSuccess, Net::HTTPRedirection
# OK
when Net::HTTPNotFound
warn_exit "404 Not found: #{uri}", 9
#print response.body
else
warn_exit "#{response.code}: #{uri}", 9
# Unreachable
response.error!
end
end
rescue Exception => e
warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
end
end
def print_http_request(uri, request)
return unless $print_http
#print "Request\n"
print request.method," ",uri, "\n"
print_headers(" ",request)
end
def print_http_response(response)
return unless $print_http
#print "Response\n"
print response.code, " ", response.message, "\n"
print_headers(" ",response)
end
def print_headers(marker, headers)
headers.each do |k,v|
k = k.split('-').map{|w| w.capitalize}.join('-')+':'
printf "%s%-20s %s\n",marker,k,v
end
end
def content_type(file)
file =~ /\.([^.]*)$/
ext = $1
mt = $fileMediaTypes[ext]
cs = $charset[mt]
mt = mt+';charset='+cs if ! cs.nil?
return mt
end
def charset(content_type)
return $charset[content_type]
end
def warn_exit(msg, rc)
warn msg
exit rc ;
end
def parseURI(uri_string)
begin
return URI.parse(uri_string).to_s
rescue URI::InvalidURIError => err
warn_exit "Bad URI: <#{uri_string}>", 2
end
end
## ---- Command
def cmd_soh(command=nil)
## Command line
options = {}
optparse = OptionParser.new do |opts|
# Set a banner, displayed at the top
# of the help screen.
case $cmd
when "s-http", "sparql-http", "soh"
banner="$cmd [get|post|put|delete] datasetURI graph [file]"
when "s-get", "s-head", "s-delete"
banner="$cmd datasetURI graph"
end
opts.banner = $banner
# Define the options, and what they do
options[:verbose] = false
opts.on( '-v', '--verbose', 'Verbose' ) do
options[:verbose] = true
end
options[:version] = false
opts.on( '--version', 'Print version and exit' ) do
print "#{SOH_NAME} #{SOH_VERSION}\n"
exit
end
# This displays the help screen, all programs are
# assumed to have this option.
opts.on( '-h', '--help', 'Display this screen and exit' ) do
puts opts
exit
end
end
begin optparse.parse!
rescue OptionParser::InvalidArgument => e
warn e
exit
end
$verbose = options[:verbose]
$print_http = $verbose
if command.nil?
if ARGV.size == 0
warn "No command given: expected one of 'get', 'put', 'post', 'delete', 'query' or 'update'"
exit 1
end
cmdPrint=ARGV.shift
command=cmdPrint.upcase
else
cmdPrint=command
end
case command
when "HEAD", "GET", "DELETE"
requiredFile=false
when "PUT", "POST"
requiredFile=true
when "QUERY"
cmd_sparql_query
when "UPDATE"
cmd_sparql_update
else
warn_exit "Unknown command: #{command}", 2
end
if requiredFile
then
if ARGV.size != 3
warn_exit "Required: dataset URI, graph URI (or 'default') and file", 1
end
else
if ARGV.size != 2
warn_exit "Required: dataset URI and graph URI (or 'default')", 1
end
end
dataset=parseURI(ARGV.shift)
# Relative URI?
graph=parseURI(ARGV.shift)
file=""
if requiredFile
then
file = ARGV.shift if requiredFile
if ! File.exist?(file)
warn_exit "No such file: "+file, 3
end
if File.directory?(file)
warn_exit "File is a directory: "+file, 3
end
end
case command
when "GET"
GET(dataset, graph)
when "HEAD"
HEAD(dataset, graph)
when "PUT"
PUT(dataset, graph, file)
when "DELETE"
DELETE(dataset, graph)
when "POST"
POST(dataset, graph, file)
else
warn_exit "Internal error: Unknown command: #{cmd}", 2
end
exit 0
end
## --------
def string_or_file(arg)
return arg if ! arg.match(/^@/)
a=(arg[1..-1])
open(a, 'rb'){|f| f.read}
end
## -------- SPARQL Query
## Choose method
def SPARQL_query(service, query, query_file, forcePOST=false, args2={})
if ! query_file.nil?
query = open(query_file, 'rb'){|f| f.read}
end
if forcePOST || query.length >= 2*1024
SPARQL_query_POST(service, query, args2)
else
SPARQL_query_GET(service, query, args2)
end
end
## By GET
def SPARQL_query_GET(service, query, args2)
args = { "query" => query }
args.merge!(args2)
qs=args.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
if service.include? "?"
then
action="#{service}&#{qs}"
else
action="#{service}?#{qs}"
end
headers={}
headers.merge!($headers)
headers[$hAccept]=$accept_results
get_worker(action, headers)
end
## By POST
def SPARQL_query_POST(service, query, args2)
# DRY - body/no body for each of request and response.
post_params={ "query" => query }
post_params.merge!(args2)
uri = URI.parse(service)
headers={}
headers.merge!($headers)
headers[$hAccept]=$accept_results
execute_post_form_body(uri, headers, post_params)
end
def execute_post_form_body(uri, headers, post_params)
request = Net::HTTP::Post.new(uri.request_uri)
qs=post_params.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
headers[$hContentType] = $mtWWWForm
headers[$hContentLength] = qs.length.to_s
request.initialize_http_header(headers)
request.body = qs
print_http_request(uri, request)
response_print_body(uri, request)
end
# Usage: -v --help --file= --query=
def cmd_sparql_query
options={}
optparse = OptionParser.new do |opts|
opts.banner = "Usage: #{$cmd} [--query QUERY] [--service URI] [--post] 'query' | @file"
opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
options[:service]=uri
end
opts.on('--query=FILE','--file=FILE', 'Take query from a file') do |file|
options[:file]=file
end
opts.on('--output=TYPE', [:json,:xml,:text,:csv,:tsv],
'Set the output argument') do |type|
options[:output]=type
end
opts.on('--accept=TYPE', [:json,:xml,:text,:csv,:tsv],
'Set the accept header type') do |type|
options[:accept]=type
end
options[:verbose] = false
opts.on( '--post', 'Force use of POST' ) do
options[:post] = true
end
opts.on( '-v', '--verbose', 'Verbose' ) do
options[:verbose] = true
end
opts.on( '--version', 'Print version and exit' ) do
print "#{SOH_NAME} #{SOH_VERSION}\n"
exit
end
opts.on( '-h', '--help', 'Display this screen and exit' ) do
puts opts
exit
end
end
begin optparse.parse!
rescue OptionParser::InvalidArgument, OptionParser::InvalidOption => e
warn e
exit 1
end
$verbose = options[:verbose]
$print_http = $verbose
usePOST = options[:post]
service = options[:service]
warn_exit 'No service specified. Required --service=URI',1 if service.nil?
# Query
query=nil
query_file=options[:file]
if query_file.nil? && ARGV.size == 0
then
warn_exit 'No query specified.',1
end
if query_file.nil?
query = ARGV.shift
if query.match(/^@/)
query_file = query[1..-1]
query = nil
end
end
# --output ==> output= (non-standard)
args={}
case options[:output]
when nil
when "json","xml","text","csv","tsv"
args['output'] = options[:output]
when :json,:xml,:text,:csv,:tsv
args['output'] = options[:output].to_s
else
warn_exit "Unrecognized output type: "+options[:output],2
end
# --accept
# options[:accept]
print "SPARQL #{service}\n" if $verbose
#args={"output"=>"text"}
SPARQL_query(service, query, query_file, usePOST, args)
exit(0)
end
## -------- SPARQL Update
# Update sent as a WWW form.
def SPARQL_update_by_form(service, update, args2={})
args = {}
args.merge!(args2)
headers={}
headers.merge!($headers)
# args? encode?
body="update="+uri_escape(update)
headers[$hContentType] = $mtWWWForm
headers[$hContentLength] = body.length.to_s
uri = URI.parse(service)
execute_post_form(uri, headers, body)
end
# DRY - query form.
def execute_post_form(uri, headers, body)
request = Net::HTTP::Post.new(uri.request_uri)
request.initialize_http_header(headers)
request.body = body
print_http_request(uri, request)
response_no_body(uri, request)
end
def SPARQL_update(service, update, args2={})
args = {}
args.merge!(args2)
headers={}
headers.merge!($headers)
headers[$hContentType] = $mtSparqlUpdate
uri = URI.parse(service)
request = Net::HTTP::Post.new(uri.request_uri)
request.initialize_http_header(headers)
request.body = update
print_http_request(uri, request)
response_no_body(uri, request)
end
def cmd_sparql_update(by_raw_post=true)
# Share with cmd_sparql_query
options={}
optparse = OptionParser.new do |opts|
opts.banner = "Usage: #{$cmd} [--file REQUEST] [--service URI] 'request' | @file"
opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
options[:service]=uri
end
opts.on('--update=FILE', '--file=FILE', 'Take update from a file') do |file|
options[:file]=file
end
options[:verbose] = false
opts.on( '-v', '--verbose', 'Verbose' ) do
options[:verbose] = true
end
opts.on( '--version', 'Print version and exit' ) do
print "#{SOH_NAME} #{SOH_VERSION}\n"
exit
end
opts.on( '-h', '--help', 'Display this screen and exit' ) do
puts opts
exit
end
end
begin optparse.parse!
rescue OptionParser::InvalidArgument => e
warn e
exit
end
$verbose = options[:verbose]
$print_http = $verbose
service = options[:service]
warn_exit 'No service specified. Required --service=URI',1 if service.nil?
update=nil
update_file=options[:file]
if update_file.nil? && ARGV.size == 0
then
warn_exit 'No update specified.',1
end
if update_file.nil?
update = ARGV.shift
if update.match(/^@/)
update_file = update[1..-1]
update = nil
end
end
print "SPARQL-Update #{service}\n" if $verbose
args={}
# Reads in the file :-(
if update.nil?
then
update = open(update_file, 'rb'){|f| f.read}
else
update = string_or_file(update)
end
if by_raw_post
SPARQL_update(service, update, args)
else
SPARQL_update_by_form(service, update, args)
end
exit(0)
end
## -------
case $cmd
when "s-http", "sparql-http", "soh"
$banner="#{$cmd} [get|post|put|delete] datasetURI graph [file]"
cmd_soh
when "s-get", "s-head", "s-put", "s-delete", "s-post"
case $cmd
when "s-get", "s-head", "s-delete"
$banner="#{$cmd} datasetURI graph"
when "s-put", "s-post"
$banner="#{$cmd} datasetURI graph file"
end
cmd2 = $cmd.sub(/^s-/, '').upcase
cmd_soh cmd2
when "s-query", "sparql-query"
cmd_sparql_query
when "s-update", "sparql-update"
cmd_sparql_update true
when "s-update-form", "sparql-update-form"
cmd_sparql_update false
else
warn_exit "Unknown: "+$cmd, 1
end
...@@ -12,6 +12,7 @@ from reqman.apps.reqtool.rest_api.services.parse_ontologies import * ...@@ -12,6 +12,7 @@ from reqman.apps.reqtool.rest_api.services.parse_ontologies import *
from pygments.formatters.html import HtmlFormatter from pygments.formatters.html import HtmlFormatter
from pygments import highlight from pygments import highlight
from subprocess import call from subprocess import call
from reqman.settings.environment import env
#get prefix syntax from the Onotlogy# #get prefix syntax from the Onotlogy#
...@@ -85,15 +86,14 @@ def create_infer_result(instance, destination): ...@@ -85,15 +86,14 @@ def create_infer_result(instance, destination):
def initialize_instances(instance): def initialize_instances(instance):
try : try :
g = Graph() g = Graph()
print(instance.ontology_file)
file_name = instance.title_bgroup.replace('/', '') file_name = instance.title_bgroup.replace('/', '')
save_path = "../../Ontologies/"+file_name+"/" save_path = "../../Ontologies/"+file_name+"/"
if (os.path.exists("../../Ontologies/"+file_name+"/") == False): if (os.path.exists("../../Ontologies/"+file_name+"/") == False):
os.mkdir("../../Ontologies/"+file_name) os.mkdir("../../Ontologies/"+file_name)
completeName = os.path.join(save_path, file_name) completeName = os.path.join(save_path, file_name)
if (instance.ontology_file != '../../Ontologies/Default'): if (instance.ontology_file != '../../Ontologies/Default'):
ont = instance.ontology_file.replace('../../Ontologies/', '') ont = instance.ontology_file.replace('../../Ontologies', '')
call("./../../Ontologies/s-get http://155.207.131.19:3030/"+ont+" default >> ../../Ontologies/"+file_name+'/'+file_name+'.ttl', shell=True) call("./../../Ontologies/s-get "+ env("FUSEKI_URL")+ ont +" default >> ../../Ontologies/"+file_name+'/'+file_name+'.ttl', shell=True)
destination=save_path+file_name+'.ttl' destination=save_path+file_name+'.ttl'
else : else :
g.load('../../Ontologies/2022_AOCS.ttl', format="turtle") g.load('../../Ontologies/2022_AOCS.ttl', format="turtle")
......
...@@ -4,8 +4,6 @@ from rdflib import ConjunctiveGraph, URIRef, RDFS, RDF, Namespace, Literal ...@@ -4,8 +4,6 @@ from rdflib import ConjunctiveGraph, URIRef, RDFS, RDF, Namespace, Literal
#from subprocess import call #from subprocess import call
#call("./../../Ontologies/s-get http://155.207.131.19:3030/Mokos_18_1_7_47/data default >> ../../Ontologies/data.ttl", shell=True)
#HERE #HERE
#list_of_DSO = ["http://delab.csd.auth.gr/ontologies/2018/SAO#","http://delab.csd.auth.gr/ontologies/2018/DSO#", "http://delab.csd.auth.gr/ontologies/2018/DSO-Automotive#", "http://delab.csd.auth.gr/ontologies/2018/DSO-Automotive-AVP#", "http://delab.csd.auth.gr/ontologies/2018/DSO-Automotive-AVP-instances#","http://delab.csd.auth.gr/ontologies/2018/RDO-instances#"] #list_of_DSO = ["http://delab.csd.auth.gr/ontologies/2018/SAO#","http://delab.csd.auth.gr/ontologies/2018/DSO#", "http://delab.csd.auth.gr/ontologies/2018/DSO-Automotive#", "http://delab.csd.auth.gr/ontologies/2018/DSO-Automotive-AVP#", "http://delab.csd.auth.gr/ontologies/2018/DSO-Automotive-AVP-instances#","http://delab.csd.auth.gr/ontologies/2018/RDO-instances#"]
list_of_DSO = [] list_of_DSO = []
......
...@@ -5,6 +5,7 @@ from django.conf.urls import url ...@@ -5,6 +5,7 @@ from django.conf.urls import url
from .views import user_views, requirements_views, main_req_views, suffix_req_views from .views import user_views, requirements_views, main_req_views, suffix_req_views
urlpatterns = [ urlpatterns = [
url(r'^signup/$', user_views.signup, name='signup'),
path('users/', user_views.UserList.as_view(), name='api-user-list'), path('users/', user_views.UserList.as_view(), name='api-user-list'),
path('users/<uuid:pk>/', user_views.UserDetail.as_view(), name='api-post-details'), path('users/<uuid:pk>/', user_views.UserDetail.as_view(), name='api-post-details'),
path('ontologies/', requirements_views.OntologiesChoicesViewSet.as_view(), name='api-get-ontologies'), path('ontologies/', requirements_views.OntologiesChoicesViewSet.as_view(), name='api-get-ontologies'),
......
...@@ -34,7 +34,7 @@ class OntologiesChoicesViewSet(APIView): ...@@ -34,7 +34,7 @@ class OntologiesChoicesViewSet(APIView):
def get(self, request): def get(self, request):
data={'datasets':''} data={'datasets':''}
try : try :
url = requests.get(env("FUSEKI_URL")+"/$/datasets", auth = HTTPBasicAuth('admin', 'pw!!!')) url = requests.get(env("FUSEKI_URL")+"/$/datasets", auth = HTTPBasicAuth(env("FUSEKI_Username"), env("FUSEKI_Password")))
text = url.text text = url.text
data = json.loads(text) data = json.loads(text)
except: except:
......
...@@ -2,6 +2,12 @@ from rest_framework.generics import ListAPIView, RetrieveAPIView ...@@ -2,6 +2,12 @@ from rest_framework.generics import ListAPIView, RetrieveAPIView
from reqman.apps.account.models import User from reqman.apps.account.models import User
from reqman.apps.reqtool.rest_api.serializers import UserSerializer from reqman.apps.reqtool.rest_api.serializers import UserSerializer
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
import json
from django.core.mail import send_mail
from django.conf import settings
class UserList(ListAPIView): class UserList(ListAPIView):
queryset = User.objects.all() queryset = User.objects.all()
...@@ -10,4 +16,24 @@ class UserList(ListAPIView): ...@@ -10,4 +16,24 @@ class UserList(ListAPIView):
class UserDetail(RetrieveAPIView): class UserDetail(RetrieveAPIView):
queryset = User.objects.all() queryset = User.objects.all()
serializer_class = UserSerializer serializer_class = UserSerializer
\ No newline at end of file
@csrf_exempt
def signup(request):
if request.method == 'POST':
data = json.loads(request.body)
mail = data['email']
username = data['username']
password = data['password1']
send_mail(
'New register from Requirement tool',
' Username :'+username+'\n Mail:'+mail+' \n Password:'+password,
settings.EMAIL_HOST_USER,
['nestorid@gapps.auth.gr'],
fail_silently=False,
)
return HttpResponse("OK")
else:
return HttpResponse("Error")
#form = UserCreationForm()
#return render(request, 'signup.html', {'form': form})
\ No newline at end of file
...@@ -30,7 +30,7 @@ def rel(*path): ...@@ -30,7 +30,7 @@ def rel(*path):
# SECURITY WARNING: don't run with debug turned on in production! # SECURITY WARNING: don't run with debug turned on in production!
DEBUG = env.bool("REQMAN_DEBUG") DEBUG = env.bool("REQMAN_DEBUG")
ALLOWED_HOSTS = env.list("REQMAN_ALLOWED_HOSTS", default=["127.0.0.1", "155.207.131.19"]) ALLOWED_HOSTS = env.list("REQMAN_ALLOWED_HOSTS")
SECRET_KEY = env.str("REQMAN_SECRET_KEY") SECRET_KEY = env.str("REQMAN_SECRET_KEY")
...@@ -157,8 +157,21 @@ JWT_AUTH = { ...@@ -157,8 +157,21 @@ JWT_AUTH = {
CORS_ORIGIN_ALLOW_ALL = False # If this is used then `CORS_ORIGIN_WHITELIST` will not have any effect CORS_ORIGIN_ALLOW_ALL = False # If this is used then `CORS_ORIGIN_WHITELIST` will not have any effect
CORS_ALLOW_CREDENTIALS = True CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = [ CORS_ORIGIN_WHITELIST = [
'http://155.207.131.19:8081', env('UI_URL'),
] # If this is used, then not need to use `CORS_ORIGIN_ALLOW_ALL = True` ] # If this is used, then not need to use `CORS_ORIGIN_ALLOW_ALL = True`
CORS_ORIGIN_REGEX_WHITELIST = [ CORS_ORIGIN_REGEX_WHITELIST = [
'http://155.207.131.19:8081', env('UI_URL'),
] ]
CSRF_TRUSTED_ORIGINS = [env('UI_URL')]
# Email config
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = env('EMAIL_HOST')
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = env('EMAIL_HOST_USER')
EMAIL_HOST_PASSWORD = env('EMAIL_HOST_PASSWORD')
\ No newline at end of file
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