master moved from 98cfe0d1d372 to b81b631a7d3f 2 new revisions: Revision: dd1f91cacde3 Author: Andrew Lindesay <apl@xxxxxxxxxxxxxx> Date: Wed Aug 6 09:46:44 2014 UTC Log: + implement 'featured' and 'prominence' http://code.google.com/p/haiku-depot-web-app/source/detail?r=dd1f91cacde3 Revision: b81b631a7d3f Author: Andrew Lindesay <apl@xxxxxxxxxxxxxx> Date: Wed Aug 6 10:50:47 2014 UTC Log: + implement 'featured' and 'prominence' (german localization) http://code.google.com/p/haiku-depot-web-app/source/detail?r=b81b631a7d3f ============================================================================== Revision: dd1f91cacde3 Author: Andrew Lindesay <apl@xxxxxxxxxxxxxx> Date: Wed Aug 6 09:46:44 2014 UTC Log: + implement 'featured' and 'prominence' http://code.google.com/p/haiku-depot-web-app/source/detail?r=dd1f91cacde3 Added:/haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/miscellaneous/GetAllProminencesRequest.java /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/miscellaneous/GetAllProminencesResult.java /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/UpdatePkgProminenceRequest.java /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/UpdatePkgProminenceResult.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/dataobjects/Prominence.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/dataobjects/auto/_Prominence.java /haikudepotserver-webapp/src/main/resources/db/haikudepot/migration/V1.14__Prominence.sql /haikudepotserver-webapp/src/main/webapp/js/app/controller/editpkgprominence.html /haikudepotserver-webapp/src/main/webapp/js/app/controller/editpkgprominencecontroller.js
Modified:/haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/MiscellaneousApi.java /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/PkgApi.java /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/GetBulkPkgResult.java /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/GetPkgResult.java /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/SearchPkgsRequest.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/api1/MiscellaneousApiImpl.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/api1/PkgApiImpl.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/dataobjects/auto/_Pkg.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/pkg/PkgOrchestrationService.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/pkg/model/PkgSearchSpecification.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/security/AuthorizationService.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/security/model/Permission.java
/haikudepotserver-webapp/src/main/resources/HaikuDepot.map.xml /haikudepotserver-webapp/src/main/resources/messages.properties /haikudepotserver-webapp/src/main/resources/messages_de.properties/haikudepotserver-webapp/src/main/webapp/js/app/controller/homecontroller.js
/haikudepotserver-webapp/src/main/webapp/js/app/controller/viewpkg.html/haikudepotserver-webapp/src/main/webapp/js/app/controller/viewpkgcontroller.js
/haikudepotserver-webapp/src/main/webapp/js/app/routes.js/haikudepotserver-webapp/src/main/webapp/js/app/service/breadcrumbfactoryservice.js /haikudepotserver-webapp/src/main/webapp/js/app/service/referencedataservice.js /haikudepotserver-webapp/src/test/java/org/haikuos/haikudepotserver/IntegrationTestSupportService.java /haikudepotserver-webapp/src/test/java/org/haikuos/haikudepotserver/api1/PkgApiIT.java /haikudepotserver-webapp/src/test/java/org/haikuos/haikudepotserver/userrating/UserRatingOrchestrationServiceIT.java
======================================= --- /dev/null+++ /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/miscellaneous/GetAllProminencesRequest.java Wed Aug 6 09:46:44 2014 UTC
@@ -0,0 +1,9 @@ +/* + * Copyright 2014, Andrew Lindesay + * Distributed under the terms of the MIT License. + */ + +package org.haikuos.haikudepotserver.api1.model.miscellaneous; + +public class GetAllProminencesRequest { +} ======================================= --- /dev/null+++ /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/miscellaneous/GetAllProminencesResult.java Wed Aug 6 09:46:44 2014 UTC
@@ -0,0 +1,35 @@ +/* + * Copyright 2014, Andrew Lindesay + * Distributed under the terms of the MIT License. + */ + +package org.haikuos.haikudepotserver.api1.model.miscellaneous; + +import java.util.List; + +public class GetAllProminencesResult { + + public List<Prominence> prominences; + + public GetAllProminencesResult() { + } + + public GetAllProminencesResult(List<Prominence> prominences) { + this.prominences = prominences; + } + + public static class Prominence { + + public Integer ordering; + public String name; + + public Prominence() { + } + + public Prominence(Integer ordering, String name) { + this.ordering = ordering; + this.name = name; + } + } + +} ======================================= --- /dev/null+++ /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/UpdatePkgProminenceRequest.java Wed Aug 6 09:46:44 2014 UTC
@@ -0,0 +1,13 @@ +/* + * Copyright 2014, Andrew Lindesay + * Distributed under the terms of the MIT License. + */ + +package org.haikuos.haikudepotserver.api1.model.pkg; + +public class UpdatePkgProminenceRequest { + + public String pkgName; + public Integer prominenceOrdering; + +} ======================================= --- /dev/null+++ /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/UpdatePkgProminenceResult.java Wed Aug 6 09:46:44 2014 UTC
@@ -0,0 +1,9 @@ +/* + * Copyright 2014, Andrew Lindesay + * Distributed under the terms of the MIT License. + */ + +package org.haikuos.haikudepotserver.api1.model.pkg; + +public class UpdatePkgProminenceResult { +} ======================================= --- /dev/null+++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/dataobjects/Prominence.java Wed Aug 6 09:46:44 2014 UTC
@@ -0,0 +1,47 @@ +/* + * Copyright 2014, Andrew Lindesay + * Distributed under the terms of the MIT License. + */ + +package org.haikuos.haikudepotserver.dataobjects; + +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; +import com.google.common.collect.Iterables; +import org.apache.cayenne.ObjectContext; +import org.apache.cayenne.exp.ExpressionFactory; +import org.apache.cayenne.query.Ordering; +import org.apache.cayenne.query.SelectQuery; +import org.apache.cayenne.query.SortOrder; +import org.haikuos.haikudepotserver.dataobjects.auto._Prominence; + +import java.util.List; + +public class Prominence extends _Prominence { + + public final static Integer ORDERING_LAST = 1000; ++ public static Optional<Prominence> getByOrdering(ObjectContext context, Integer ordering) {
+ Preconditions.checkNotNull(context); + Preconditions.checkState(null!=ordering && ordering >= 0); + return Optional.fromNullable(Iterables.getOnlyElement( + (List<Prominence>) context.performQuery(new SelectQuery( + Prominence.class,+ ExpressionFactory.matchExp(Prominence.ORDERING_PROPERTY, ordering))),
+ null + )); + } + + public static List<Prominence> getAll(ObjectContext context) { + Preconditions.checkNotNull(context); + SelectQuery query = new SelectQuery(Prominence.class);+ query.addOrdering(new Ordering(ORDERING_PROPERTY, SortOrder.ASCENDING));
+ return (List<Prominence>) context.performQuery(query); + } + + @Override + public String toString() { + return "prominence;"+getOrdering(); + } + +} ======================================= --- /dev/null+++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/dataobjects/auto/_Prominence.java Wed Aug 6 09:46:44 2014 UTC
@@ -0,0 +1,26 @@ +package org.haikuos.haikudepotserver.dataobjects.auto; + +import org.haikuos.haikudepotserver.dataobjects.support.AbstractDataObject; + +/** + * Class _Prominence was generated by Cayenne. + * It is probably a good idea to avoid changing this class manually, + * since it may be overwritten next time code is regenerated. + * If you need to make any customizations, please use subclass. + */ +public abstract class _Prominence extends AbstractDataObject { + + public static final String NAME_PROPERTY = "name"; + public static final String ORDERING_PROPERTY = "ordering"; + + public static final String ID_PK_COLUMN = "id"; + + public String getName() { + return (String)readProperty(NAME_PROPERTY); + } + + public Integer getOrdering() { + return (Integer)readProperty(ORDERING_PROPERTY); + } + +} ======================================= --- /dev/null+++ /haikudepotserver-webapp/src/main/resources/db/haikudepot/migration/V1.14__Prominence.sql Wed Aug 6 09:46:44 2014 UTC
@@ -0,0 +1,28 @@ +-- ------------------------------------------------------ +-- ADD PROMINENCE FOR A PACKAGE +-- ------------------------------------------------------ + +CREATE TABLE haikudepot.prominence ( + id BIGINT NOT NULL, + ordering INT NOT NULL, + name VARCHAR(255) NOT NULL, + PRIMARY KEY (id) +); + +CREATE SEQUENCE haikudepot.prominence_seq START WITH 3112 INCREMENT BY 1; + +CREATE UNIQUE INDEX prominence_idx01 ON haikudepot.prominence(ordering); +CREATE UNIQUE INDEX prominence_idx02 ON haikudepot.prominence(name); ++INSERT INTO haikudepot.prominence (id,ordering,name) VALUES ((SELECT nextval('haikudepot.prominence_seq')), 100, '1st'); +INSERT INTO haikudepot.prominence (id,ordering,name) VALUES ((SELECT nextval('haikudepot.prominence_seq')), 200, '2nd'); +INSERT INTO haikudepot.prominence (id,ordering,name) VALUES ((SELECT nextval('haikudepot.prominence_seq')), 300, '3rd'); +INSERT INTO haikudepot.prominence (id,ordering,name) VALUES ((SELECT nextval('haikudepot.prominence_seq')), 1000, 'Last');
+ +ALTER TABLE haikudepot.pkg ADD COLUMN prominence_id BIGINT;+UPDATE haikudepot.pkg SET prominence_id = (SELECT id FROM haikudepot.prominence WHERE ordering=1000);
+ALTER TABLE haikudepot.pkg ALTER COLUMN prominence_id SET NOT NULL; ++ALTER TABLE haikudepot.pkg ADD FOREIGN KEY (prominence_id) REFERENCES haikudepot.prominence (id);
++INSERT INTO haikudepot.permission (id, code, name) VALUES ((SELECT nextval('haikudepot.permission_seq')), 'pkg_editprominence', 'Edit Package Prominence');
======================================= --- /dev/null+++ /haikudepotserver-webapp/src/main/webapp/js/app/controller/editpkgprominence.html Wed Aug 6 09:46:44 2014 UTC
@@ -0,0 +1,40 @@ +<breadcrumbs items="breadcrumbItems"></breadcrumbs> + +<div class="content-container"> + + <form name="editPkgCategoriesForm" novalidate="novalidate"> + + <label><message key="gen.pkg.title"></message></label> + <div class="form-control-group"> + <div class="form-control-group-static"> + <pkg-label pkg="pkg"></pkg-label> + </div> + </div> ++ <label for="prominences"><message key="editPkgProminence.prominence.title"></message></label>
+ <div class="form-control-group"> + <select + id="prominences" + required="true" + ng-model="selectedProminence"+ ng-options="aProminence.title for aProminence in prominences">
+ </select> + </div> + + <div class="form-action-container"> + <button + ng-disabled="editPkgProminence.$invalid" + ng-click="goStoreProminence()" + type="submit" + class="main-action"> + <message key="editPkgProminence.action.title"></message> + </button> + </div> + + </form> + +</div> + +<div class="footer"></div> +<spinner spin="shouldSpin()"></spinner> + ======================================= --- /dev/null+++ /haikudepotserver-webapp/src/main/webapp/js/app/controller/editpkgprominencecontroller.js Wed Aug 6 09:46:44 2014 UTC
@@ -0,0 +1,109 @@ +/* + * Copyright 2014, Andrew Lindesay + * Distributed under the terms of the MIT License. + */ + +angular.module('haikudepotserver').controller( + 'EditPkgProminenceController', + [ + '$scope','$log','$location','$routeParams', + 'jsonRpc','constants','errorHandling', + 'breadcrumbs','referenceData', + 'pkg','breadcrumbFactory', + function( + $scope,$log,$location,$routeParams, + jsonRpc,constants,errorHandling, + breadcrumbs,referenceData, + pkg,breadcrumbFactory) { + + $scope.pkg = undefined; + $scope.amSaving = false; + $scope.selectedProminence = undefined; + $scope.prominences = undefined; + + $scope.shouldSpin = function() {+ return undefined == $scope.pkg || undefined == $scope.prominences || $scope.amSaving;
+ }; ++ // pulls the pkg data back from the server so that it can be used to
+ // display the form. + + function refetchPkg() {+ pkg.getPkgWithSpecificVersionFromRouteParams($routeParams, false).then(
+ function(result) { + $scope.pkg = result; + $log.info('found '+result.name+' pkg'); + refreshBreadcrumbItems(); ++ // now get the categories and from the data in the pkg it should be possible to + // pre-select those categories which are presently configured on the pkg.
+ + referenceData.prominences().then( + function(data) { + + $scope.prominences = _.clone(data); ++ // here we're not using the localization system because the names are so + // tightly bound to the ordering and nobody is going to see them anyway.
+ + _.each( + $scope.prominences, + function(item) {+ item.title = item.name + ' (' + item.ordering + ')';
+ } + ); + + $scope.selectedProminence = _.findWhere( + $scope.prominences,+ { ordering : $scope.pkg.prominenceOrdering }
+ ); + + }, + function() { + // logging happens inside + errorHandling.navigateToError(); + } + ) + }, + function() { + errorHandling.navigateToError(); + } + ); + } + + refetchPkg(); + + function refreshBreadcrumbItems() { + breadcrumbs.mergeCompleteStack([ + breadcrumbFactory.createHome(),+ breadcrumbFactory.createViewPkgWithSpecificVersionFromRouteParams($routeParams), + breadcrumbFactory.applyCurrentLocation(breadcrumbFactory.createEditPkgProminence($scope.pkg))
+ ]); + } ++ // stores the categories back to the server for this package. When it has done this, it will return to
+ // view the pkg again. + + $scope.goStoreProminence = function() { + jsonRpc.call( + constants.ENDPOINT_API_V1_PKG, + 'updatePkgProminence', + [{ + pkgName : $scope.pkg.name,+ prominenceOrdering : $scope.selectedProminence.ordering
+ }] + ).then( + function() {+ $log.info('have updated the prominence for pkg '+$scope.pkg.name);
+ breadcrumbs.popAndNavigate(); + }, + function(err) { + $log.error('unable to update pkg prominence'); + errorHandling.handleJsonRpcError(err); + } + ); + } + + } + ] +); =======================================--- /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/MiscellaneousApi.java Thu Jul 24 11:35:00 2014 UTC +++ /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/MiscellaneousApi.java Wed Aug 6 09:46:44 2014 UTC
@@ -60,4 +60,10 @@GetAllUserRatingStabilitiesResult getAllUserRatingStabilities(GetAllUserRatingStabilitiesRequest getAllUserRatingStabilitiesRequest);
+ /** + * <p>This method will return all of the possible prominences.</p> + */ ++ GetAllProminencesResult getAllProminences(GetAllProminencesRequest request);
+ } =======================================--- /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/PkgApi.java Sun Jun 29 11:22:04 2014 UTC +++ /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/PkgApi.java Wed Aug 6 09:46:44 2014 UTC
@@ -132,4 +132,11 @@GetBulkPkgResult getBulkPkg(GetBulkPkgRequest getBulkPkgRequest) throws LimitExceededException, ObjectNotFoundException;
+ /**+ * <p>This method will update the prominence of the nominated package. The prominence is identified by the
+ * ordering of the prominence as a natural identifier.</p> + */ ++ UpdatePkgProminenceResult updatePkgProminence(UpdatePkgProminenceRequest request) throws ObjectNotFoundException;
+ } =======================================--- /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/GetBulkPkgResult.java Wed Jun 4 11:36:29 2014 UTC +++ /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/GetBulkPkgResult.java Wed Aug 6 09:46:44 2014 UTC
@@ -32,6 +32,8 @@ public Float derivedRating; + public Integer prominenceOrdering; + } public static class PkgVersion { =======================================--- /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/GetPkgResult.java Wed Jun 4 11:36:29 2014 UTC +++ /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/GetPkgResult.java Wed Aug 6 09:46:44 2014 UTC
@@ -27,8 +27,11 @@ public List<String> pkgCategoryCodes; public Float derivedRating; + public Integer derivedRatingSampleSize; + public Integer prominenceOrdering; + public static class PkgVersion { public String major; =======================================--- /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/SearchPkgsRequest.java Sun Jun 29 11:22:04 2014 UTC +++ /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/SearchPkgsRequest.java Wed Aug 6 09:46:44 2014 UTC
@@ -7,8 +7,6 @@ import org.haikuos.haikudepotserver.api1.support.AbstractSearchRequest; -import java.util.List; - /*** <p>This is the model object that is used to define the request to search for packages in the system.</p>
*/ @@ -17,6 +15,7 @@ public enum SortOrdering { NAME, + PROMINENCE, VERSIONCREATETIMESTAMP, VERSIONVIEWCOUNTER } =======================================--- /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/api1/MiscellaneousApiImpl.java Sun Aug 3 11:11:48 2014 UTC +++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/api1/MiscellaneousApiImpl.java Wed Aug 6 09:46:44 2014 UTC
@@ -221,5 +221,23 @@ ) ); } + + @Override+ public GetAllProminencesResult getAllProminences(GetAllProminencesRequest request) {
+ Preconditions.checkNotNull(request); + final ObjectContext context = serverRuntime.getContext(); + + return new GetAllProminencesResult( + Lists.transform( + Prominence.getAll(context),+ new Function<Prominence, GetAllProminencesResult.Prominence>() {
+ @Override+ public GetAllProminencesResult.Prominence apply(Prominence input) { + return new GetAllProminencesResult.Prominence(input.getOrdering(), input.getName());
+ } + } + ) + ); + } } =======================================--- /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/api1/PkgApiImpl.java Sun Aug 3 11:11:48 2014 UTC +++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/api1/PkgApiImpl.java Wed Aug 6 09:46:44 2014 UTC
@@ -396,6 +396,7 @@ result.modifyTimestamp = pkg.getModifyTimestamp().getTime(); result.derivedRating = pkg.getDerivedRating(); result.derivedRatingSampleSize = pkg.getDerivedRatingSampleSize(); + result.prominenceOrdering = pkg.getProminence().getOrdering();result.pkgCategoryCodes = Lists.transform(pkg.getPkgPkgCategories(), new Function<PkgPkgCategory, String>() {
@Override public String apply(PkgPkgCategory input) { @@ -1040,6 +1041,7 @@GetBulkPkgResult.Pkg resultPkg = new GetBulkPkgResult.Pkg(); resultPkg.modifyTimestamp = input.getPkg().getModifyTimestamp().getTime();
resultPkg.name = input.getPkg().getName();+ resultPkg.prominenceOrdering = input.getPkg().getProminence().getOrdering(); resultPkg.derivedRating = input.getPkg().getDerivedRating();
if(getBulkPkgRequest.filter.contains(GetBulkPkgRequest.Filter.PKGICONS)) {
@@ -1117,5 +1119,34 @@ return result; } + + @Override+ public UpdatePkgProminenceResult updatePkgProminence(UpdatePkgProminenceRequest request) throws ObjectNotFoundException {
+ Preconditions.checkNotNull(request);+ Preconditions.checkState(!Strings.isNullOrEmpty(request.pkgName),"the package name must be supplied on the request"); + Preconditions.checkState(null!=request.prominenceOrdering,"the presence ordering must be supplied");
+ + final ObjectContext context = serverRuntime.getContext(); + Pkg pkg = getPkg(context, request.pkgName); + + User authUser = obtainAuthenticatedUser(context); ++ if(!authorizationService.check(context, authUser, pkg, Permission.PKG_EDITPROMINENCE)) {
+ throw new AuthorizationFailureException(); + } ++ Optional<Prominence> prominenceOptional = Prominence.getByOrdering(context, request.prominenceOrdering);
+ + if(!prominenceOptional.isPresent()) {+ throw new ObjectNotFoundException(Prominence.class.getSimpleName(), request.prominenceOrdering);
+ } + + pkg.setProminence(prominenceOptional.get()); + context.commitChanges(); ++ LOGGER.info("the prominence for {} has been set to; {}", pkg.toString(), prominenceOptional.get().toString());
+ + return new UpdatePkgProminenceResult(); + } } =======================================--- /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/dataobjects/auto/_Pkg.java Sun Jun 29 11:22:04 2014 UTC +++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/dataobjects/auto/_Pkg.java Wed Aug 6 09:46:44 2014 UTC
@@ -7,6 +7,7 @@ import org.haikuos.haikudepotserver.dataobjects.PkgIcon; import org.haikuos.haikudepotserver.dataobjects.PkgPkgCategory; import org.haikuos.haikudepotserver.dataobjects.PkgScreenshot; +import org.haikuos.haikudepotserver.dataobjects.Prominence; import org.haikuos.haikudepotserver.dataobjects.Publisher; import org.haikuos.haikudepotserver.dataobjects.support.AbstractDataObject; @@ -28,6 +29,7 @@ public static final String PKG_ICONS_PROPERTY = "pkgIcons";public static final String PKG_PKG_CATEGORIES_PROPERTY = "pkgPkgCategories";
public static final String PKG_SCREENSHOTS_PROPERTY = "pkgScreenshots"; + public static final String PROMINENCE_PROPERTY = "prominence"; public static final String PUBLISHER_PROPERTY = "publisher"; public static final String ID_PK_COLUMN = "id"; @@ -120,6 +122,15 @@ public List<PkgScreenshot> getPkgScreenshots() { return (List<PkgScreenshot>)readProperty(PKG_SCREENSHOTS_PROPERTY); } + + + public void setProminence(Prominence prominence) { + setToOneTarget(PROMINENCE_PROPERTY, prominence, true); + } + + public Prominence getProminence() { + return (Prominence)readProperty(PROMINENCE_PROPERTY); + } public void setPublisher(Publisher publisher) { =======================================--- /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/pkg/PkgOrchestrationService.java Sun Aug 3 11:11:48 2014 UTC +++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/pkg/PkgOrchestrationService.java Wed Aug 6 09:46:44 2014 UTC
@@ -300,6 +300,9 @@orderExpressions.add("pv." + PkgVersion.CREATE_TIMESTAMP_PROPERTY + " DESC");
break; + case PROMINENCE:+ orderExpressions.add("pv." + PkgVersion.PKG_PROPERTY + "." + Pkg.PROMINENCE_PROPERTY + "." + Prominence.ORDERING_PROPERTY + " ASC");
+ case NAME: // gets added anyway... break; @@ -616,6 +619,7 @@persistedPkg = objectContext.newObject(org.haikuos.haikudepotserver.dataobjects.Pkg.class);
persistedPkg.setName(pkg.getName()); persistedPkg.setActive(Boolean.TRUE);+ persistedPkg.setProminence(Prominence.getByOrdering(objectContext, Prominence.ORDERING_LAST).get());
LOGGER.info("the package {} did not exist; will create", pkg.getName());
} =======================================--- /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/pkg/model/PkgSearchSpecification.java Sun Jun 29 11:22:04 2014 UTC +++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/pkg/model/PkgSearchSpecification.java Wed Aug 6 09:46:44 2014 UTC
@@ -21,6 +21,7 @@ public enum SortOrdering { NAME, + PROMINENCE, VERSIONCREATETIMESTAMP, VERSIONVIEWCOUNTER } =======================================--- /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/security/AuthorizationService.java Sat Jul 26 04:02:29 2014 UTC +++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/security/AuthorizationService.java Wed Aug 6 09:46:44 2014 UTC
@@ -145,6 +145,7 @@ case PKG_EDITICON: case PKG_EDITSCREENSHOT: case PKG_EDITCATEGORIES: + case PKG_EDITPROMINENCE: case PKG_EDITVERSIONLOCALIZATION: {List<? extends AuthorizationPkgRule> rules = authenticatedUser.getAuthorizationPkgRules((Pkg) target); if (Iterables.tryFind(rules, new Predicate<AuthorizationPkgRule>() {
@@ -201,6 +202,7 @@ case PKG_EDITSCREENSHOT: case PKG_EDITCATEGORIES: case PKG_EDITVERSIONLOCALIZATION: + case PKG_EDITPROMINENCE:return null!=authenticatedUser && authenticatedUser.getIsRoot();
case USERRATING_EDIT: =======================================--- /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/security/model/Permission.java Thu Jul 24 11:35:00 2014 UTC +++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/security/model/Permission.java Wed Aug 6 09:46:44 2014 UTC
@@ -27,7 +27,8 @@ PKG_EDITICON(TargetType.PKG), PKG_EDITSCREENSHOT(TargetType.PKG), PKG_EDITCATEGORIES(TargetType.PKG), - PKG_EDITVERSIONLOCALIZATION(TargetType.PKG); + PKG_EDITVERSIONLOCALIZATION(TargetType.PKG), + PKG_EDITPROMINENCE(TargetType.PKG); private TargetType requiredTargetType; =======================================--- /haikudepotserver-webapp/src/main/resources/HaikuDepot.map.xml Mon Jul 28 09:04:02 2014 UTC +++ /haikudepotserver-webapp/src/main/resources/HaikuDepot.map.xml Wed Aug 6 09:46:44 2014 UTC
@@ -63,6 +63,7 @@<db-attribute name="id" type="BIGINT" isPrimaryKey="true" isMandatory="true"/> <db-attribute name="modify_timestamp" type="TIMESTAMP" isMandatory="true"/> <db-attribute name="name" type="VARCHAR" isMandatory="true" length="255"/>
+ <db-attribute name="prominence_id" type="BIGINT" isMandatory="true"/> <db-attribute name="publisher_id" type="BIGINT"/> <db-key-generator> <db-generator-type>ORACLE</db-generator-type> @@ -213,6 +214,16 @@ <db-key-cache-size>1</db-key-cache-size> </db-key-generator> </db-entity> + <db-entity name="prominence" schema="haikudepot">+ <db-attribute name="id" type="BIGINT" isPrimaryKey="true" isMandatory="true"/> + <db-attribute name="name" type="VARCHAR" isMandatory="true" length="255"/>
+ <db-attribute name="ordering" type="INTEGER" isMandatory="true"/> + <db-key-generator> + <db-generator-type>ORACLE</db-generator-type> + <db-generator-name>haikudepot.prominence_seq</db-generator-name> + <db-key-cache-size>1</db-key-cache-size> + </db-key-generator> + </db-entity> <db-entity name="publisher" schema="haikudepot"> <db-attribute name="active" type="BOOLEAN" isMandatory="true"/> <db-attribute name="code" type="VARCHAR" length="255"/> @@ -370,14 +381,18 @@<obj-attribute name="body" type="java.lang.String" lock="true" db-attribute-path="body"/>
</obj-entity><obj-entity name="PkgVersionLocalization" className="org.haikuos.haikudepotserver.dataobjects.PkgVersionLocalization" lock-type="optimistic" dbEntityName="pkg_version_localization" superClassName="org.haikuos.haikudepotserver.dataobjects.support.AbstractDataObject"> - <obj-attribute name="createTimestamp" type="java.sql.Timestamp" db-attribute-path="create_timestamp"/> + <obj-attribute name="createTimestamp" type="java.sql.Date" db-attribute-path="create_timestamp"/> <obj-attribute name="description" type="java.lang.String" lock="true" db-attribute-path="description"/> - <obj-attribute name="modifyTimestamp" type="java.sql.Timestamp" db-attribute-path="modify_timestamp"/> + <obj-attribute name="modifyTimestamp" type="java.util.Date" db-attribute-path="modify_timestamp"/> <obj-attribute name="summary" type="java.lang.String" lock="true" db-attribute-path="summary"/>
</obj-entity><obj-entity name="PkgVersionUrl" className="org.haikuos.haikudepotserver.dataobjects.PkgVersionUrl" lock-type="optimistic" dbEntityName="pkg_version_url" superClassName="org.haikuos.haikudepotserver.dataobjects.support.AbstractDataObject"> <obj-attribute name="url" type="java.lang.String" lock="true" db-attribute-path="url"/>
</obj-entity>+ <obj-entity name="Prominence" className="org.haikuos.haikudepotserver.dataobjects.Prominence" readOnly="true" lock-type="optimistic" dbEntityName="prominence" superClassName="org.haikuos.haikudepotserver.dataobjects.support.AbstractDataObject"> + <obj-attribute name="name" type="java.lang.String" db-attribute-path="name"/> + <obj-attribute name="ordering" type="java.lang.Integer" db-attribute-path="ordering"/>
+ </obj-entity><obj-entity name="Publisher" className="org.haikuos.haikudepotserver.dataobjects.Publisher" lock-type="optimistic" dbEntityName="publisher" superClassName="org.haikuos.haikudepotserver.dataobjects.support.AbstractDataObject"> <obj-attribute name="active" type="java.lang.Boolean" lock="true" db-attribute-path="active"/> <obj-attribute name="code" type="java.lang.String" lock="true" db-attribute-path="code"/>
@@ -450,6 +465,9 @@<db-relationship name="user" source="permission_user_pkg" target="user" toMany="false">
<db-attribute-pair source="user_id" target="id"/> </db-relationship>+ <db-relationship name="permission_user_pkgs" source="pkg" target="permission_user_pkg" toMany="true">
+ <db-attribute-pair source="id" target="pkg_id"/> + </db-relationship><db-relationship name="pkg_icons" source="pkg" target="pkg_icon" toMany="true">
<db-attribute-pair source="id" target="pkg_id"/> </db-relationship> @@ -459,12 +477,12 @@<db-relationship name="pkg_screenshots" source="pkg" target="pkg_screenshot" toMany="true">
<db-attribute-pair source="id" target="pkg_id"/> </db-relationship>+ <db-relationship name="prominence" source="pkg" target="prominence" toMany="false">
+ <db-attribute-pair source="prominence_id" target="id"/> + </db-relationship><db-relationship name="publisher" source="pkg" target="publisher" toMany="false">
<db-attribute-pair source="publisher_id" target="id"/> </db-relationship>- <db-relationship name="untitledRel" source="pkg" target="permission_user_pkg" toMany="true">
- <db-attribute-pair source="id" target="pkg_id"/> - </db-relationship><db-relationship name="pkg_pkg_categories" source="pkg_category" target="pkg_pkg_category" toMany="true">
<db-attribute-pair source="id" target="pkg_category_id"/> </db-relationship> @@ -540,6 +558,9 @@<db-relationship name="pkg_version" source="pkg_version_url" target="pkg_version" toMany="false">
<db-attribute-pair source="pkg_version_id" target="id"/> </db-relationship>+ <db-relationship name="pkgs" source="prominence" target="pkg" toMany="true">
+ <db-attribute-pair source="id" target="prominence_id"/> + </db-relationship><db-relationship name="pkgs" source="publisher" target="pkg" toMany="true">
<db-attribute-pair source="id" target="publisher_id"/> </db-relationship> @@ -582,10 +603,11 @@<obj-relationship name="permission" source="PermissionUserPkg" target="Permission" deleteRule="Nullify" db-relationship-path="permission"/> <obj-relationship name="pkg" source="PermissionUserPkg" target="Pkg" deleteRule="Nullify" db-relationship-path="pkg"/> <obj-relationship name="user" source="PermissionUserPkg" target="User" deleteRule="Nullify" db-relationship-path="user"/> - <obj-relationship name="permissionUserPkgs" source="Pkg" target="PermissionUserPkg" deleteRule="Cascade" db-relationship-path="untitledRel"/> + <obj-relationship name="permissionUserPkgs" source="Pkg" target="PermissionUserPkg" deleteRule="Cascade" db-relationship-path="permission_user_pkgs"/> <obj-relationship name="pkgIcons" source="Pkg" target="PkgIcon" deleteRule="Cascade" db-relationship-path="pkg_icons"/> <obj-relationship name="pkgPkgCategories" source="Pkg" target="PkgPkgCategory" deleteRule="Cascade" db-relationship-path="pkg_pkg_categories"/> <obj-relationship name="pkgScreenshots" source="Pkg" target="PkgScreenshot" deleteRule="Cascade" db-relationship-path="pkg_screenshots"/> + <obj-relationship name="prominence" source="Pkg" target="Prominence" deleteRule="Nullify" db-relationship-path="prominence"/> <obj-relationship name="publisher" source="Pkg" target="Publisher" deleteRule="Nullify" db-relationship-path="publisher"/> <obj-relationship name="mediaType" source="PkgIcon" target="MediaType" deleteRule="Nullify" db-relationship-path="media_type"/> <obj-relationship name="pkg" source="PkgIcon" target="Pkg" deleteRule="Nullify" db-relationship-path="pkg"/>
=======================================--- /haikudepotserver-webapp/src/main/resources/messages.properties Sun Aug 3 11:11:48 2014 UTC +++ /haikudepotserver-webapp/src/main/resources/messages.properties Wed Aug 6 09:46:44 2014 UTC
@@ -27,6 +27,7 @@ breadcrumb.authenticateUser.title=Login breadcrumb.createUser.title=Create User breadcrumb.editPkgCategories.title=Categories +breadcrumb.editPkgProminence.title=Prominence breadcrumb.editPkgIcon.title=Icon breadcrumb.editPkgScreenshots.title=Screenshots breadcrumb.editPkgVersionLocalizations.title=Localization @@ -112,7 +113,8 @@editPkgVersionLocalization.selectedArchitectureApplicability.singleArchitecture.title=Architecture '{0}' only editPkgVersionLocalization.selectedArchitectureApplicability.allArchitectures.title=Latest version of all architectures for package '{0}'.
-home.viewCriteriaType.all=All +home.viewCriteriaType.featured=Featured +home.viewCriteriaType.all=Alphabetical home.viewCriteriaType.categories=Categories home.viewCriteriaType.mostrecent=Recent Updates; Sort on Version Date home.viewCriteriaType.mostviewed=Recent Updates; Sort on Most Viewed @@ -164,6 +166,9 @@ rating.none=No rating specified +editPkgProminence.prominence.title=Prominence +editPkgProminence.action.title=Save + editPkgCategories.categories.title=CategorieseditPkgCategories.categories.maximumThreeNote=A maximum of three package categories is allowed.
editPkgCategories.action.title=Save @@ -189,6 +194,7 @@ listUsers.showInactiveAction.title=Show inactive users listUsers.createUserAction.title=Create user +viewPkg.prominence.title=Prominence viewPkg.categories.title=Categories viewPkg.categories.none=None viewPkg.versionViews.title=Version Views @@ -199,6 +205,7 @@ viewPkg.downloadIconHvifAction.title=Download icon in 'hvif' format viewPkg.editScreenshotsAction.title=Edit screenshots viewPkg.editPkgCategoriesAction.title=Edit categories +viewPkg.editPkgProminenceAction.title=Edit prominence viewPkg.editVersionLocalizationAction.title=Edit localizations viewPkg.userRating.title=User Rating viewPkg.userRating.title.plural=User Ratings =======================================--- /haikudepotserver-webapp/src/main/resources/messages_de.properties Sun Aug 3 11:11:48 2014 UTC +++ /haikudepotserver-webapp/src/main/resources/messages_de.properties Wed Aug 6 09:46:44 2014 UTC
@@ -110,7 +110,8 @@editPkgVersionLocalization.selectedArchitectureApplicability.singleArchitecture.title=nur die '{0}' Architektur editPkgVersionLocalization.selectedArchitectureApplicability.allArchitectures.title=die neueste Version für alle Architekturen des Pakets '{0}'.
-home.viewCriteriaType.all=Alles +home.viewCriteriaType.featured=Gekennzeichnet +home.viewCriteriaType.all=Alphabetisch home.viewCriteriaType.categories=Kategorienhome.viewCriteriaType.mostrecent=Neu aktualisiert; sortiert nach Versionsdatum home.viewCriteriaType.mostviewed=Neu aktualisiert; sortiert nach am meisten angesehen
=======================================--- /haikudepotserver-webapp/src/main/webapp/js/app/controller/homecontroller.js Tue Jul 8 11:11:57 2014 UTC +++ /haikudepotserver-webapp/src/main/webapp/js/app/controller/homecontroller.js Wed Aug 6 09:46:44 2014 UTC
@@ -26,6 +26,7 @@ var KEY_VIEWCRITERIATYPECODE = 'viewcrttyp'; var ViewCriteriaTypes = { + FEATURED : 'FEATURED', ALL : 'ALL', MOSTVIEWED : 'MOSTVIEWED', CATEGORIES : 'CATEGORIES', @@ -45,6 +46,7 @@ $scope.selectedPkgCategory = undefined; $scope.viewCriteriaTypeOptions = _.map( [ + ViewCriteriaTypes.FEATURED, ViewCriteriaTypes.ALL, ViewCriteriaTypes.CATEGORIES, ViewCriteriaTypes.MOSTRECENT, @@ -62,7 +64,7 @@ $scope.selectedViewCriteriaTypeOption = _.findWhere( $scope.viewCriteriaTypeOptions, {- code : $location.search()[KEY_VIEWCRITERIATYPECODE] ? $location.search()[KEY_VIEWCRITERIATYPECODE] : ViewCriteriaTypes.ALL + code : $location.search()[KEY_VIEWCRITERIATYPECODE] ? $location.search()[KEY_VIEWCRITERIATYPECODE] : ViewCriteriaTypes.FEATURED
} ); @@ -80,11 +82,11 @@ -1 != searchMixins.nextMatchSearchExpression( pkg.versions[0].summary.toLowerCase(),0,$scope.lastRefetchPkgsSearchExpression,'CONTAINS').offset;
- } + }; $scope.shouldShowDerivedRating = function(pkg) { return angular.isNumber(pkg.derivedRating); - } + }; // pagination $scope.pkgs = { @@ -231,11 +233,11 @@ function(chain) {- $scope.$watch('pkgs.offset', function(newValue, oldValue) {
+ $scope.$watch('pkgs.offset', function() { refetchPkgs(); });- $scope.$watch('selectedPkgCategory', function(newValue, oldValue) {
+ $scope.$watch('selectedPkgCategory', function() { var option = $scope.selectedViewCriteriaTypeOption;if(option && option.code == ViewCriteriaTypes.CATEGORIES) {
@@ -245,7 +247,7 @@// this gets hit when somebody chooses an architecture such as x86, x86_64 etc...
- $scope.$watch('selectedArchitecture', function(newValue, oldValue) {
+ $scope.$watch('selectedArchitecture', function() { if(undefined != $scope.pkgs.items) { refetchPkgsAtFirstPage(); @@ -264,6 +266,7 @@ case ViewCriteriaTypes.MOSTRECENT: case ViewCriteriaTypes.MOSTVIEWED: + case ViewCriteriaTypes.FEATURED: case ViewCriteriaTypes.ALL: refetchPkgsAtFirstPage(); break; @@ -275,6 +278,9 @@ refetchPkgsAtFirstPage(); break; + default:+ throw new Error('unknown view criteria type option; ' + newValue.code);
+ } } }); @@ -346,6 +352,10 @@ switch ($scope.selectedViewCriteriaTypeOption.code) { + case ViewCriteriaTypes.FEATURED: + req.sortOrdering = 'PROMINENCE'; + break; + case ViewCriteriaTypes.ALL: break; @@ -367,6 +377,9 @@ req.sortOrdering = 'VERSIONVIEWCOUNTER'; break; + default:+ throw new Error('unexpected view criteria type option; ' + $scope.selectedViewCriteriaTypeOption.code);
+ }$scope.lastRefetchPkgsSearchExpression = $scope.searchExpression;
=======================================--- /haikudepotserver-webapp/src/main/webapp/js/app/controller/viewpkg.html Sat Jun 21 11:24:37 2014 UTC +++ /haikudepotserver-webapp/src/main/webapp/js/app/controller/viewpkg.html Wed Aug 6 09:46:44 2014 UTC
@@ -65,10 +65,16 @@ <span ng-show="pkgCategories && !pkgCategories.length"> <message key="viewPkg.categories.none"></message> </span>- <span ng-show="pkgCategories.length"><span ng-repeat="pkgCategory in pkgCategories"><span ng-show="$index">, </span><pkg-category-label pkg-category="pkgCategory"></pkg-category-label></span> + <span ng-show="pkgCategories.length"><span ng-repeat="pkgCategory in pkgCategories"><span ng-show="$index">, </span><pkg-category-label pkg-category="pkgCategory"></pkg-category-label></span></span>
</dd> <dt><message key="viewPkg.versionViews.title"></message></dt> <dd>{{pkg.versions[0].viewCounter}}</dd> + <dt pkg="pkg" show-if-pkg-permission="'PKG_EDITPROMINENCE'"> + <message key="viewPkg.prominence.title"></message> + </dt> + <dd pkg="pkg" show-if-pkg-permission="'PKG_EDITPROMINENCE'"> + {{pkg.prominence.name}} ({{pkg.prominence.ordering}}) + </dd> </dl> </div> @@ -188,6 +194,11 @@ <a href="" ng-click="goEditVersionLocalization()"><message key="viewPkg.editVersionLocalizationAction.title"></message>
</a> + </li> + <li pkg="pkg" show-if-pkg-permission="'PKG_EDITPROMINENCE'"> + <a href="" ng-click="goEditPkgProminence()">+ <message key="viewPkg.editPkgProminenceAction.title"></message>
+ </a> </li> <li pkg="pkg" show-if-pkg-permission="'PKG_EDITCATEGORIES'"> <a href="" ng-click="goEditPkgCategories()"> =======================================--- /haikudepotserver-webapp/src/main/webapp/js/app/controller/viewpkgcontroller.js Sun Jul 27 10:55:51 2014 UTC +++ /haikudepotserver-webapp/src/main/webapp/js/app/controller/viewpkgcontroller.js Wed Aug 6 09:46:44 2014 UTC
@@ -93,6 +93,7 @@ refetchPkgIconMetaData(); refetchPkgCategories(); refetchUserRatings(); + refetchProminence(); }, function() { errorHandling.navigateToError(); // already logged @@ -100,6 +101,21 @@ ); } + + function refetchProminence() { + referenceData.prominences().then( + function(prominences) { + $scope.pkg.prominence = _.findWhere( + prominences, + { ordering : $scope.pkg.prominenceOrdering } + ); + }, + function() {+ $log.error('unable to obtain the list of prominences');
+ errorHandling.navigateToError(); + } + ) + } function refetchPkgCategories() { @@ -303,6 +319,10 @@breadcrumbs.pushAndNavigate(breadcrumbFactory.createEditPkgCategories($scope.pkg));
}; + $scope.goEditPkgProminence = function() {+ breadcrumbs.pushAndNavigate(breadcrumbFactory.createEditPkgProminence($scope.pkg));
+ } + $scope.goRemoveIcon = function() { jsonRpc.call( constants.ENDPOINT_API_V1_PKG, =======================================--- /haikudepotserver-webapp/src/main/webapp/js/app/routes.js Thu Jul 24 11:35:00 2014 UTC +++ /haikudepotserver-webapp/src/main/webapp/js/app/routes.js Wed Aug 6 09:46:44 2014 UTC
@@ -35,6 +35,7 @@.when(pkgVersionPrefix+'/editicon',{controller:'EditPkgIconController', templateUrl:'/js/app/controller/editpkgicon.html'}) .when(pkgVersionPrefix+'/editscreenshots',{controller:'EditPkgScreenshotsController', templateUrl:'/js/app/controller/editpkgscreenshots.html'}) .when(pkgVersionPrefix+'/editcategories',{controller:'EditPkgCategoriesController', templateUrl:'/js/app/controller/editpkgcategories.html'}) + .when(pkgVersionPrefix+'/editprominence',{controller:'EditPkgProminenceController', templateUrl:'/js/app/controller/editpkgprominence.html'}) .when(pkgVersionPrefix+'/editversionlocalizations',{controller:'EditPkgVersionLocalizationController', templateUrl:'/js/app/controller/editpkgversionlocalization.html'}) .when(pkgVersionPrefix+'/adduserrating',{controller:'AddEditUserRatingController', templateUrl:'/js/app/controller/addedituserrating.html'})
.when('/',{controller:'HomeController',templateUrl:'/js/app/controller/home.html',reloadOnSearch:false}) =======================================--- /haikudepotserver-webapp/src/main/webapp/js/app/service/breadcrumbfactoryservice.js Sun Jul 27 10:55:51 2014 UTC +++ /haikudepotserver-webapp/src/main/webapp/js/app/service/breadcrumbfactoryservice.js Wed Aug 6 09:46:44 2014 UTC
@@ -252,6 +252,10 @@return createManipulatePkgBreadcrumbItem(pkg, 'editcategories', 'editPkgCategories');
}, + createEditPkgProminence : function(pkg) {+ return createManipulatePkgBreadcrumbItem(pkg, 'editprominence', 'editPkgProminence');
+ }, + createEditPkgIcon : function(pkg) {return createManipulatePkgBreadcrumbItem(pkg, 'editicon', 'editPkgIcon');
}, =======================================--- /haikudepotserver-webapp/src/main/webapp/js/app/service/referencedataservice.js Sun Jul 27 10:55:51 2014 UTC +++ /haikudepotserver-webapp/src/main/webapp/js/app/service/referencedataservice.js Wed Aug 6 09:46:44 2014 UTC
@@ -88,6 +88,10 @@ return getData('naturalLanguages'); }, + prominences : function() { + return getData('prominences'); + }, + pkgCategories : function() { return getData('pkgCategories'); }, =======================================--- /haikudepotserver-webapp/src/test/java/org/haikuos/haikudepotserver/IntegrationTestSupportService.java Sun Aug 3 11:11:48 2014 UTC +++ /haikudepotserver-webapp/src/test/java/org/haikuos/haikudepotserver/IntegrationTestSupportService.java Wed Aug 6 09:46:44 2014 UTC
@@ -119,6 +119,8 @@ ObjectContext context = getObjectContext(); StandardTestData result = new StandardTestData();+ Prominence prominence = Prominence.getByOrdering(context, Prominence.ORDERING_LAST).get();
+ Architecture x86 = Architecture.getByCode(context, "x86").get();Architecture x86_gcc2 = Architecture.getByCode(context, "x86_gcc2").get();
@@ -133,6 +135,7 @@ result.pkg1.setName("pkg1"); result.pkg1.setDerivedRating(3.5f); result.pkg1.setDerivedRatingSampleSize(4); + result.pkg1.setProminence(prominence); {PkgPkgCategory pkgPkgCategory = context.newObject(PkgPkgCategory.class);
@@ -204,6 +207,7 @@ result.pkg2 = context.newObject(Pkg.class); result.pkg2.setActive(true); result.pkg2.setName("pkg2"); + result.pkg2.setProminence(prominence); result.pkg2Version1 = context.newObject(PkgVersion.class); result.pkg2Version1.setActive(Boolean.TRUE); @@ -218,6 +222,7 @@ result.pkg3 = context.newObject(Pkg.class); result.pkg3.setActive(true); result.pkg3.setName("pkg3"); + result.pkg3.setProminence(prominence); result.pkg3Version1 = context.newObject(PkgVersion.class); result.pkg3Version1.setActive(Boolean.TRUE); =======================================--- /haikudepotserver-webapp/src/test/java/org/haikuos/haikudepotserver/api1/PkgApiIT.java Sun Jun 29 11:22:04 2014 UTC +++ /haikudepotserver-webapp/src/test/java/org/haikuos/haikudepotserver/api1/PkgApiIT.java Wed Aug 6 09:46:44 2014 UTC
@@ -745,5 +745,28 @@ Assertions.assertThat(pkg1.versions.get(0).minor).isNull(); } + + @Test + public void testUpdatePkgProminence() throws Exception { + + setAuthenticatedUserToRoot(); + + integrationTestSupportService.createStandardTestData(); ++ UpdatePkgProminenceRequest request = new UpdatePkgProminenceRequest();
+ request.pkgName = "pkg1"; + request.prominenceOrdering = 200; + + // ------------------------------------ + pkgApi.updatePkgProminence(request); + // ------------------------------------ + + { + ObjectContext context = serverRuntime.getContext(); + Pkg pkg1 = Pkg.getByName(context, "pkg1").get();+ Assertions.assertThat(pkg1.getProminence().getOrdering()).isEqualTo(200);
+ } + + } } =======================================--- /haikudepotserver-webapp/src/test/java/org/haikuos/haikudepotserver/userrating/UserRatingOrchestrationServiceIT.java Wed Jun 4 11:36:29 2014 UTC +++ /haikudepotserver-webapp/src/test/java/org/haikuos/haikudepotserver/userrating/UserRatingOrchestrationServiceIT.java Wed Aug 6 09:46:44 2014 UTC
@@ -64,6 +64,7 @@ userRatingTestData.pkg = context.newObject(Pkg.class); userRatingTestData.pkg.setName("urtestpkg");+ userRatingTestData.pkg.setProminence(Prominence.getByOrdering(context, Prominence.ORDERING_LAST).get());
userRatingTestData.user1 = integrationTestSupportService.createBasicUser(context,"urtestuser1","password"); userRatingTestData.user2 = integrationTestSupportService.createBasicUser(context,"urtestuser2","password");
============================================================================== Revision: b81b631a7d3f Author: Andrew Lindesay <apl@xxxxxxxxxxxxxx> Date: Wed Aug 6 10:50:47 2014 UTC Log: + implement 'featured' and 'prominence' (german localization) http://code.google.com/p/haiku-depot-web-app/source/detail?r=b81b631a7d3f Modified: /haikudepotserver-webapp/src/main/resources/messages_de.properties =======================================--- /haikudepotserver-webapp/src/main/resources/messages_de.properties Wed Aug 6 09:46:44 2014 UTC +++ /haikudepotserver-webapp/src/main/resources/messages_de.properties Wed Aug 6 10:50:47 2014 UTC
@@ -24,6 +24,7 @@ breadcrumb.changePassword.title=Kennwort ändern breadcrumb.authenticateUser.title=Anmelden breadcrumb.createUser.title=Benutzer anlegen +breadcrumb.editPkgProminence.title=Empfehlungsstufen breadcrumb.editPkgCategories.title=Kategorien breadcrumb.editPkgIcon.title=Icon breadcrumb.editPkgScreenshots.title=Screenshots @@ -87,6 +88,9 @@ authenticateUser.createUserAction.title=Neuen Benutzer registrierenauthenticateUser.initiatePasswordResetAction.title=Vergessenes Kennwort zurücksetzen
+editPkgProminence.prominence.title=Empfehlungsstufen +editPkgProminence.action.title=Speichern +editPkgIcon.iconBitmap32File.required=Es wird eine 32x32 Pixel große Version des Icons benötigt. editPkgIcon.iconBitmap32File.badsize=Die Datei ist zu groß oder zu klein, um als PNG Bild für dieses Icon benutzt zu werden. editPkgIcon.iconBitmap32File.badformatorsize=Die Datei ist entweder nicht im PNG Format, oder besitzt nicht die richtigen Abmessungen für das Paket-Icon.
@@ -113,6 +117,7 @@ home.viewCriteriaType.featured=Gekennzeichnet home.viewCriteriaType.all=Alphabetisch home.viewCriteriaType.categories=Kategorien +home.viewCriteriaType.featured=Empfehlunghome.viewCriteriaType.mostrecent=Neu aktualisiert; sortiert nach Versionsdatum home.viewCriteriaType.mostviewed=Neu aktualisiert; sortiert nach am meisten angesehen
home.searchButton.title=Los @@ -186,6 +191,7 @@ listUsers.showInactiveAction.title=Zeige inaktive Benutzer listUsers.createUserAction.title=Benutzer anlegen +viewPkg.prominence.title=Empfehlungsstufen viewPkg.categories.title=Kategorien viewPkg.categories.none=keine viewPkg.versionViews.title=Versionsanzeigen @@ -203,6 +209,7 @@viewPkg.userRating.addAction.unauthenticated=Um eine Bewertung abgeben zu können, ist eine Anmeldung erforderlich.
viewPkg.userRating.noResults=Es wurden keine Bewertungen gefunden. viewPkg.userRating.noResults.addAction=Erste Bewertung abgeben. +viewPkg.editPkgProminenceAction.title=Empfehlungsstufe bearbeitenviewPkg.userRating.noResults.authenticateAction=Anmelden, um die erste Bewertung abzugeben.
viewPkg.userRating.user.by=von viewPkg.derivedUserRating.sampleSize={0} Bewertungen