Project

General

Profile

« Previous | Next » 

Revision 57607

warnings

View differences:

modules/dnet-orgs-database-application/trunk/src/main/java/eu/dnetlib/organizations/repository/readonly/WarningViewRepository.java
1
package eu.dnetlib.organizations.repository.readonly;
2

  
3
import org.springframework.stereotype.Repository;
4

  
5
import eu.dnetlib.organizations.model.view.WarningView;
6
import eu.dnetlib.organizations.model.view.WarningViewPK;
7

  
8
@Repository
9
public interface WarningViewRepository extends ReadOnlyRepository<WarningView, WarningViewPK> {
10

  
11
}
modules/dnet-orgs-database-application/trunk/src/main/java/eu/dnetlib/organizations/model/view/WarningView.java
1
package eu.dnetlib.organizations.model.view;
2

  
3
import java.io.Serializable;
4

  
5
import javax.persistence.Column;
6
import javax.persistence.Entity;
7
import javax.persistence.Id;
8
import javax.persistence.IdClass;
9
import javax.persistence.Table;
10

  
11
@Entity
12
@Table(name = "warnings_view")
13
@IdClass(WarningViewPK.class)
14
public class WarningView implements Serializable {
15

  
16
	/**
17
	 *
18
	 */
19
	private static final long serialVersionUID = -6621501199394187765L;
20

  
21
	@Id
22
	@Column(name = "id_1")
23
	private String id1;
24

  
25
	@Id
26
	@Column(name = "id_2")
27
	private String id2;
28

  
29
	@Column(name = "name_1")
30
	private String name1;
31

  
32
	@Column(name = "name_2")
33
	private String name2;
34

  
35
	@Column(name = "type_1")
36
	private String type1;
37

  
38
	@Column(name = "type_2")
39
	private String type2;
40

  
41
	@Column(name = "city_1")
42
	private String city1;
43

  
44
	@Column(name = "city_2")
45
	private String city2;
46

  
47
	@Column(name = "country_1")
48
	private String country1;
49

  
50
	@Column(name = "country_2")
51
	private String country2;
52

  
53
	public String getId1() {
54
		return id1;
55
	}
56

  
57
	public void setId1(final String id1) {
58
		this.id1 = id1;
59
	}
60

  
61
	public String getId2() {
62
		return id2;
63
	}
64

  
65
	public void setId2(final String id2) {
66
		this.id2 = id2;
67
	}
68

  
69
	public String getName1() {
70
		return name1;
71
	}
72

  
73
	public void setName1(final String name1) {
74
		this.name1 = name1;
75
	}
76

  
77
	public String getName2() {
78
		return name2;
79
	}
80

  
81
	public void setName2(final String name2) {
82
		this.name2 = name2;
83
	}
84

  
85
	public String getType1() {
86
		return type1;
87
	}
88

  
89
	public void setType1(final String type1) {
90
		this.type1 = type1;
91
	}
92

  
93
	public String getType2() {
94
		return type2;
95
	}
96

  
97
	public void setType2(final String type2) {
98
		this.type2 = type2;
99
	}
100

  
101
	public String getCity1() {
102
		return city1;
103
	}
104

  
105
	public void setCity1(final String city1) {
106
		this.city1 = city1;
107
	}
108

  
109
	public String getCity2() {
110
		return city2;
111
	}
112

  
113
	public void setCity2(final String city2) {
114
		this.city2 = city2;
115
	}
116

  
117
	public String getCountry1() {
118
		return country1;
119
	}
120

  
121
	public void setCountry1(final String country1) {
122
		this.country1 = country1;
123
	}
124

  
125
	public String getCountry2() {
126
		return country2;
127
	}
128

  
129
	public void setCountry2(final String country2) {
130
		this.country2 = country2;
131
	}
132

  
133
}
modules/dnet-orgs-database-application/trunk/src/main/java/eu/dnetlib/organizations/model/view/WarningViewPK.java
1
package eu.dnetlib.organizations.model.view;
2

  
3
import java.io.Serializable;
4
import java.util.Objects;
5

  
6
public class WarningViewPK implements Serializable {
7

  
8
	/**
9
	 *
10
	 */
11
	private static final long serialVersionUID = -4702103726315884367L;
12

  
13
	private String id1;
14

  
15
	private String id2;
16

  
17
	public String getId1() {
18
		return id1;
19
	}
20

  
21
	public void setId1(final String id1) {
22
		this.id1 = id1;
23
	}
24

  
25
	public String getId2() {
26
		return id2;
27
	}
28

  
29
	public void setId2(final String id2) {
30
		this.id2 = id2;
31
	}
32

  
33
	@Override
34
	public int hashCode() {
35
		return Objects.hash(id1, id2);
36
	}
37

  
38
	@Override
39
	public boolean equals(final Object obj) {
40
		if (this == obj) { return true; }
41
		if (obj == null) { return false; }
42
		if (!(obj instanceof WarningViewPK)) { return false; }
43
		final WarningViewPK other = (WarningViewPK) obj;
44
		return Objects.equals(id1, other.id1) && Objects.equals(id2, other.id2);
45
	}
46

  
47
	@Override
48
	public String toString() {
49
		return String.format("WarningViewPK [id1=%s, id2=%s]", id1, id2);
50
	}
51
}
modules/dnet-orgs-database-application/trunk/src/main/java/eu/dnetlib/organizations/utils/OpenOrgsConstants.java
6 6
	public static final String superUserRole = "SUPERUSER";
7 7
	public static final String pendingRole = "PENDING";
8 8

  
9
	public static final String OPENORGS_PREFIX = "openorgs____::";
10
	public static final String OPENORGS_MESH_PREFIX = "openorgsmesh::";
11

  
9 12
}
modules/dnet-orgs-database-application/trunk/src/main/java/eu/dnetlib/organizations/controller/OrganizationController.java
2 2

  
3 3
import java.util.Arrays;
4 4
import java.util.List;
5
import java.util.stream.Collectors;
5 6

  
6 7
import org.apache.commons.lang3.StringUtils;
7 8
import org.springframework.beans.factory.annotation.Autowired;
......
20 21
import eu.dnetlib.organizations.model.utils.RelationByOrg;
21 22
import eu.dnetlib.organizations.model.view.OrganizationSimpleView;
22 23
import eu.dnetlib.organizations.model.view.OrganizationView;
24
import eu.dnetlib.organizations.model.view.WarningView;
23 25
import eu.dnetlib.organizations.repository.OpenaireSimRelRepository;
24 26
import eu.dnetlib.organizations.repository.OrganizationRepository;
25 27
import eu.dnetlib.organizations.repository.readonly.OrganizationSimpleViewRepository;
26 28
import eu.dnetlib.organizations.repository.readonly.OrganizationViewRepository;
29
import eu.dnetlib.organizations.repository.readonly.WarningViewRepository;
27 30
import eu.dnetlib.organizations.utils.DatabaseUtils;
31
import eu.dnetlib.organizations.utils.OpenOrgsConstants;
28 32
import eu.dnetlib.organizations.utils.RelationType;
29 33

  
30 34
@RestController
......
40 44
	@Autowired
41 45
	private OpenaireSimRelRepository openaireSimRelRepository;
42 46
	@Autowired
47
	private WarningViewRepository warningViewRepository;
48
	@Autowired
43 49
	private DatabaseUtils databaseUtils;
44 50

  
45 51
	@RequestMapping(value = "/save", method = RequestMethod.POST)
......
121 127
	@RequestMapping(value = "/similarities", method = RequestMethod.GET)
122 128
	public List<OpenaireSimRel> findSimilaritiesById(@RequestParam final String id, final Authentication authentication) {
123 129
		if (UserInfo.isSuperUser(authentication) || organizationRepository.verifyAuthorizationForId(id, authentication.getName())) {
124
			return openaireSimRelRepository.findByLocalId(id);
130
			return openaireSimRelRepository.findByLocalId(id).stream().filter(s -> !s.getOaOriginalId().startsWith(OpenOrgsConstants.OPENORGS_PREFIX)).collect(Collectors.toList());
125 131
		} else {
126 132
			throw new RuntimeException("User not authorized");
127 133
		}
128 134
	}
129 135

  
136
	@RequestMapping(value = "/warnings", method = RequestMethod.GET)
137
	public Iterable<WarningView> findWarningsById(final Authentication authentication) {
138
		if (UserInfo.isSuperUser(authentication)) {
139
			return warningViewRepository.findAll();
140
		} else {
141
			throw new RuntimeException("User not authorized");
142
		}
143
	}
144

  
130 145
	@RequestMapping(value = "/similarities", method = RequestMethod.POST)
131 146
	public List<OpenaireSimRel> saveSimilarities(@RequestBody final List<OpenaireSimRel> simrels, final Authentication authentication) {
132 147

  
133
		final boolean b = UserInfo.isSuperUser(authentication) || simrels.stream()
134
				.map(OpenaireSimRel::getLocalId)
135
				.distinct()
136
				.allMatch(id -> organizationRepository.verifyAuthorizationForId(id, authentication.getName()));
148
		final boolean b = UserInfo.isSuperUser(authentication)
149
				|| simrels.stream().map(OpenaireSimRel::getLocalId).distinct().allMatch(id -> organizationRepository.verifyAuthorizationForId(id, authentication.getName()));
137 150

  
138 151
		if (b) {
139 152
			return openaireSimRelRepository.saveAll(simrels);
modules/dnet-orgs-database-application/trunk/src/main/resources/sql/schema.sql
1 1
DROP VIEW organizations_view;
2 2
DROP VIEW organizations_simple_view;
3 3
DROP VIEW users_view;
4
DROP VIEW warnings_view;
4 5

  
5 6
DROP TABLE IF EXISTS other_ids;
6 7
DROP TABLE IF EXISTS other_names;
......
195 196
GROUP BY u.email, u.valid, u.role
196 197
ORDER BY u.email;
197 198

  
199
CREATE VIEW warnings_view AS SELECT
200
    o1.id      AS id_1,
201
    o1.name    AS name_1,
202
    o1.type    AS type_1,
203
	o1.city    AS city_1,
204
	o1.country AS country_1,
205
    o2.id      AS id_2,
206
    o2.name    AS name_2,
207
    o2.type    AS type_2,
208
	o2.city    AS city_2,
209
	o2.country AS country_2
210
FROM
211
	openaire_simrels s
212
	LEFT OUTER JOIN organizations o1 ON (s.local_id = o1.id)
213
    LEFT OUTER JOIN organizations o2 ON (s.oa_original_id = o2.id)
214
WHERE
215
	s.oa_original_id LIKE 'openorgs____::%' AND o1.id IS NOT NULL AND O2.id IS NOT NULL;
216
	
198 217

  
218

  
199 219
	
modules/dnet-orgs-database-application/trunk/src/main/resources/static/resources/html/similarities.html
1
<p class="muted"><b>ID: </b>{{orgId}}</p>
1
<div class="row" style="height: 5em">
2
	<div class="col-xl-8 col-lg-10">
3
		<p class="muted"><b>ID: </b>{{orgId}}</p>
4
	</div>
5
</div>
2 6

  
3 7
<div class="row">
4
	<div class="col-xl-8 col-lg-10">
8
	<div class="col-xl-10">
5 9
		<div class="card">
6 10
			<div class="card-header">
7 11
				<ul class="nav nav-tabs card-header-tabs">
......
9 13
						<a href="#!/metadata/0/{{orgId}}" class="nav-link">Metadata</a>
10 14
					</li>
11 15
					<li class="nav-item">
12
						<a href="#!/relations/{{orgId}}" class="nav-link" href="#">Relations</a>
16
						<a href="#!/relations/{{orgId}}" class="nav-link">Relations</a>
13 17
					</li>
14 18
					<li class="nav-item">
15
						<a href="javascript:void(0)" class="nav-link active" href="#">Similarities</a>
19
						<a href="javascript:void(0)" class="nav-link active">Similarities</a>
16 20
					</li>
17 21
				</ul>
18 22
			</div>
......
26 30
					<tr>
27 31
						<th class="pl-3" style="border-top: none;">Related organization</th>
28 32
						<th class="text-center" style="border-top: none;">Acronym</th>
29
						<th class="text-center" style="border-top: none;">Original ID</th>
30 33
						<th class="text-center" style="border-top: none;">Country</th>
31
						<th class="text-center" style="border-top: none;">Collected from</th>
34
						<th style="border-top: none;">Source</th>
32 35
						<th style="border-top: none;"></th>
33 36
					</tr>
34 37
				</thead>
......
39 42
							<span class="small" ng-if="sr.oaUrl" ><br /><b>URL: </b><a href="{{sr.oaUrl}}" target="_blank">{{sr.oaUrl}}</a></span>
40 43
						</td>
41 44
						<td class="text-center small">{{sr.oaAcronym}}</td>
42
						<td class="text-center small">{{sr.oaOriginalId}}</td>
43
						<td class="text-center small">{{sr.oaCountry}}</td>
44
						<td class="text-center small">{{sr.oaCollectedFrom}}</td>
45
						<td class="text-center small"><img ng-src="resources/images/flags/{{sr.oaCountry}}.gif" /> {{sr.oaCountry}}</td>
46
						<td class="small">
47
							<b>Collected from:</b> {{sr.oaCollectedFrom}}<br />
48
							<b>Original Id:</b> <span class="text-monospace">{{sr.oaOriginalId}}</span>
49
						</td>
45 50
						<td class="text-right">
46
							<div class="btn-group btn-group-sm btn-group-toggle" data-toggle="buttons">
51
							<div class="btn-group btn-group-toggle btn-group-sm" data-toggle="buttons">
47 52
								<label class="btn" ng-class="{'btn-danger' : sr.relType == 'is_different', 'btn-outline-danger' : sr.relType != 'is_different'}">
48
									<input type="radio" autocomplete="off" ng-model="sr.relType" value="is_different" ng-class="{'active' : sr.relType == 'is_different'}"> different
53
									<input type="radio" autocomplete="off" ng-model="sr.relType" value="is_different" ng-class="{'active' : sr.relType == 'is_different'}"><i class="fas fa-times fa-fw"></i>
49 54
								</label>
50 55
								<label class="btn" ng-class="{'btn-info' : sr.relType == 'suggested', 'btn-outline-info' : sr.relType != 'suggested'}">
51
									<input type="radio" autocomplete="off" ng-model="sr.relType" value="suggested" ng-class="{'active' : sr.relType == 'suggested'}"> suggested
56
									<input type="radio" autocomplete="off" ng-model="sr.relType" value="suggested" ng-class="{'active' : sr.relType == 'suggested'}"><i class="fas fa-question fa-fw"></i>
52 57
								</label>
53 58
								<label class="btn" ng-class="{'btn-success' : sr.relType == 'is_similar', 'btn-outline-success' : sr.relType != 'is_similar'}">
54
									<input type="radio" autocomplete="off" ng-model="sr.relType" value="is_similar" ng-class="{'active' : sr.relType == 'is_similar'}"/> similar
59
									<input type="radio" autocomplete="off" ng-model="sr.relType" value="is_similar" ng-class="{'active' : sr.relType == 'is_similar'}"/><i class="fas fa-check fa-fw"></i>
55 60
								</label>
56 61
							</div>		
57 62
						</td>
modules/dnet-orgs-database-application/trunk/src/main/resources/static/resources/html/relations.html
1
<p class="muted"><b>ID: </b>{{orgId}}</p>
1
<div class="row" style="height: 5em">
2
	<div class="col-xl-8 col-lg-10">
3
		<p class="muted"><b>ID: </b>{{orgId}}</p>
4
	</div>
5
</div>
2 6

  
3 7
<div class="row">
4 8
	<div class="col-xl-8 col-lg-10">
......
9 13
						<a href="#!/metadata/0/{{orgId}}" class="nav-link">Metadata</a>
10 14
					</li>
11 15
					<li class="nav-item">
12
						<a href="javascript:void(0)" class="nav-link active" href="#">Relations</a>
16
						<a href="javascript:void(0)" class="nav-link active">Relations</a>
13 17
					</li>
14 18
					<li class="nav-item">
15
						<a href="#!/similarities/{{orgId}}" class="nav-link" href="#">Similarities</a>
19
						<a href="#!/similarities/{{orgId}}" class="nav-link">Similarities</a>
16 20
					</li>
17 21
				</ul>
18 22
			</div>
modules/dnet-orgs-database-application/trunk/src/main/resources/static/resources/html/edit.html
18 18
						<a href="javascript:void(0)" class="nav-link active">Metadata</a>
19 19
					</li>
20 20
					<li class="nav-item" ng-if="orgId">
21
						<a href="#!/relations/{{orgId}}" class="nav-link" href="#">Relations</a>
21
						<a href="#!/relations/{{orgId}}" class="nav-link">Relations</a>
22 22
					</li>
23 23
					<li class="nav-item" ng-if="orgId">
24
						<a href="#!/similarities/{{orgId}}" class="nav-link" href="#">Similarities</a>
24
						<a href="#!/similarities/{{orgId}}" class="nav-link">Similarities</a>
25 25
					</li>
26 26
				</ul>
27 27
			</div>
modules/dnet-orgs-database-application/trunk/src/main/resources/static/resources/html/warnings.html
1
<h3>{{warnings.length}} warning(s)</h3>
2

  
3
<table class="table table-sm"  ng-if="warnings.length > 0">
4
	<thead class="thead-light">
5
		<tr>
6
			<th style="width:40px"></th>
7
			<th>Organization name</th>
8
			<th style="width:180px">Place</th>
9
			<th style="width:80px">Type</th>
10
		</tr>
11
	</thead>
12
	<tbody ng-repeat="w in warnings" class="mb-2">
13
		<tr>
14
			<th class="text-center">#1</th>
15
			<td><a href="#!/metadata/0/{{w.id1}}" title="{{w.id1}}">{{w.name1}}</a></td>
16
			<td><img ng-src="resources/images/flags/{{w.country1}}.gif" /> {{w.city1}}, {{w.country1}}</td>
17
			<td class="text-right">{{w.type1}}</td>
18
		</tr>
19
		<tr>
20
			<th class="text-center" style="width:40px">#2</th>
21
			<td><a href="#!/metadata/0/{{w.id2}}" title="{{w.id2}}">{{w.name2}}</a></td>
22
			<td><img ng-src="resources/images/flags/{{w.country2}}.gif" /> {{w.city2}}, {{w.country2}}</td>
23
			<td class="text-right">{{w.type2}}</td>
24
		</tr>
25
		<tr>
26
			<th style="width:40px"></th>
27
			<td colspan="3">
28
				<button type="button" class="btn btn-sm btn-primary">merge</button>
29
				<button type="button" class="btn btn-sm btn-outline-danger"><i class="fa fa-trash"></i></button>
30
			</td>
31
		</tr>
32
	</tbody>
33
</table>
34
			
modules/dnet-orgs-database-application/trunk/src/main/resources/static/resources/js/organizations.js
12 12
		.when('/metadata/:msg/:id',                { templateUrl: 'resources/html/edit.html',         controller: 'showMetadataCtrl' })
13 13
		.when('/relations/:id',                    { templateUrl: 'resources/html/relations.html',    controller: 'showRelationsCtrl' })
14 14
		.when('/similarities/:id',                 { templateUrl: 'resources/html/similarities.html', controller: 'showSimilaritiesCtrl' })
15
		.when('/warnings',                         { templateUrl: 'resources/html/warnings.html',     controller: 'showWarningsCtrl' })
15 16
		.when('/users',                            { templateUrl: 'resources/html/users.html',        controller: 'usersCtrl' })
16 17
		.otherwise({ redirectTo: '/search' });
17 18
});
......
267 268
});
268 269

  
269 270

  
271
orgsModule.controller('showWarningsCtrl', function ($scope, $http, $routeParams) {
272
	$scope.orgId = $routeParams.id;
273
	$scope.warnings = [];
274
	
275
	$http.get('api/organizations/warnings?id=' + $routeParams.id).then(function successCallback(res) {
276
		$scope.warnings = res.data;
277
	}, function errorCallback(res) {
278
		alert('ERROR: ' + res.data.error + ' (' + res.data.message + ')');
279
	});
270 280

  
281
});
282

  
283

  
271 284
orgsModule.controller('usersCtrl', function ($scope, $http, $timeout, $route) {
272 285
	$scope.users = [];
273 286
	$scope.vocs = {};
modules/dnet-orgs-database-application/trunk/src/main/resources/templates/home.html
54 54
					</div>
55 55
				</li>
56 56
				<li class="nav-item"><a class="nav-link" href="#!/new">New</a></li>
57
				<li class="nav-item" sec:authorize="hasRole('ROLE_SUPERUSER')"><a class="nav-link" href="#!/warnings">Warnings</a></li>
57 58
			</ul>
58 59
		</div>
59 60
		

Also available in: Unified diff