mirror of
https://gitlab.archlinux.org/archlinux/aurweb.git
synced 2025-02-03 10:43:03 +01:00
Replace categories with keywords
Remove package base categories. Instead, users can now specify up to twenty custom keywords that are taken into consideration when searching. Signed-off-by: Lukas Fleischer <lfleischer@archlinux.org>
This commit is contained in:
parent
4c1bb8b7e5
commit
5fb7a74e23
11 changed files with 112 additions and 183 deletions
|
@ -64,43 +64,11 @@ CREATE TABLE Sessions (
|
||||||
) ENGINE = InnoDB;
|
) ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
-- Categories for grouping packages when they reside in
|
|
||||||
-- Unsupported or the AUR - based on the categories defined
|
|
||||||
-- in 'extra'.
|
|
||||||
--
|
|
||||||
CREATE TABLE PackageCategories (
|
|
||||||
ID TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
||||||
Category VARCHAR(32) NOT NULL,
|
|
||||||
PRIMARY KEY (ID)
|
|
||||||
) ENGINE = InnoDB;
|
|
||||||
INSERT INTO PackageCategories (Category) VALUES ('none');
|
|
||||||
INSERT INTO PackageCategories (Category) VALUES ('daemons');
|
|
||||||
INSERT INTO PackageCategories (Category) VALUES ('devel');
|
|
||||||
INSERT INTO PackageCategories (Category) VALUES ('editors');
|
|
||||||
INSERT INTO PackageCategories (Category) VALUES ('emulators');
|
|
||||||
INSERT INTO PackageCategories (Category) VALUES ('games');
|
|
||||||
INSERT INTO PackageCategories (Category) VALUES ('gnome');
|
|
||||||
INSERT INTO PackageCategories (Category) VALUES ('i18n');
|
|
||||||
INSERT INTO PackageCategories (Category) VALUES ('kde');
|
|
||||||
INSERT INTO PackageCategories (Category) VALUES ('lib');
|
|
||||||
INSERT INTO PackageCategories (Category) VALUES ('modules');
|
|
||||||
INSERT INTO PackageCategories (Category) VALUES ('multimedia');
|
|
||||||
INSERT INTO PackageCategories (Category) VALUES ('network');
|
|
||||||
INSERT INTO PackageCategories (Category) VALUES ('office');
|
|
||||||
INSERT INTO PackageCategories (Category) VALUES ('science');
|
|
||||||
INSERT INTO PackageCategories (Category) VALUES ('system');
|
|
||||||
INSERT INTO PackageCategories (Category) VALUES ('x11');
|
|
||||||
INSERT INTO PackageCategories (Category) VALUES ('xfce');
|
|
||||||
INSERT INTO PackageCategories (Category) VALUES ('fonts');
|
|
||||||
INSERT INTO PackageCategories (Category) VALUES ('wayland');
|
|
||||||
|
|
||||||
|
|
||||||
-- Information on package bases
|
-- Information on package bases
|
||||||
--
|
--
|
||||||
CREATE TABLE PackageBases (
|
CREATE TABLE PackageBases (
|
||||||
ID INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
|
ID INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
Name VARCHAR(255) NOT NULL,
|
Name VARCHAR(255) NOT NULL,
|
||||||
CategoryID TINYINT UNSIGNED NOT NULL DEFAULT 1,
|
|
||||||
NumVotes INTEGER UNSIGNED NOT NULL DEFAULT 0,
|
NumVotes INTEGER UNSIGNED NOT NULL DEFAULT 0,
|
||||||
Popularity DECIMAL(6,2) UNSIGNED NOT NULL DEFAULT 0,
|
Popularity DECIMAL(6,2) UNSIGNED NOT NULL DEFAULT 0,
|
||||||
OutOfDateTS BIGINT UNSIGNED NULL DEFAULT NULL,
|
OutOfDateTS BIGINT UNSIGNED NULL DEFAULT NULL,
|
||||||
|
@ -111,12 +79,10 @@ CREATE TABLE PackageBases (
|
||||||
PackagerUID INTEGER UNSIGNED NULL DEFAULT NULL, -- Last packager
|
PackagerUID INTEGER UNSIGNED NULL DEFAULT NULL, -- Last packager
|
||||||
PRIMARY KEY (ID),
|
PRIMARY KEY (ID),
|
||||||
UNIQUE (Name),
|
UNIQUE (Name),
|
||||||
INDEX (CategoryID),
|
|
||||||
INDEX (NumVotes),
|
INDEX (NumVotes),
|
||||||
INDEX (SubmitterUID),
|
INDEX (SubmitterUID),
|
||||||
INDEX (MaintainerUID),
|
INDEX (MaintainerUID),
|
||||||
INDEX (PackagerUID),
|
INDEX (PackagerUID),
|
||||||
FOREIGN KEY (CategoryID) REFERENCES PackageCategories(ID) ON DELETE NO ACTION,
|
|
||||||
-- deleting a user will cause packages to be orphaned, not deleted
|
-- deleting a user will cause packages to be orphaned, not deleted
|
||||||
FOREIGN KEY (SubmitterUID) REFERENCES Users(ID) ON DELETE SET NULL,
|
FOREIGN KEY (SubmitterUID) REFERENCES Users(ID) ON DELETE SET NULL,
|
||||||
FOREIGN KEY (MaintainerUID) REFERENCES Users(ID) ON DELETE SET NULL,
|
FOREIGN KEY (MaintainerUID) REFERENCES Users(ID) ON DELETE SET NULL,
|
||||||
|
@ -124,6 +90,16 @@ CREATE TABLE PackageBases (
|
||||||
) ENGINE = InnoDB;
|
) ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
|
-- Keywords of package bases
|
||||||
|
--
|
||||||
|
CREATE TABLE PackageKeywords (
|
||||||
|
PackageBaseID INTEGER UNSIGNED NOT NULL,
|
||||||
|
Keyword VARCHAR(255) NOT NULL DEFAULT '',
|
||||||
|
PRIMARY KEY (PackageBaseID, Keyword),
|
||||||
|
FOREIGN KEY (PackageBaseID) REFERENCES PackageBases(ID) ON DELETE CASCADE
|
||||||
|
) ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
-- Information about the actual packages
|
-- Information about the actual packages
|
||||||
--
|
--
|
||||||
CREATE TABLE Packages (
|
CREATE TABLE Packages (
|
||||||
|
|
|
@ -38,4 +38,24 @@ ALTER TABLE PackageBases
|
||||||
ADD COLUMN Popularity DECIMAL(6,2) UNSIGNED NOT NULL DEFAULT 0;
|
ADD COLUMN Popularity DECIMAL(6,2) UNSIGNED NOT NULL DEFAULT 0;
|
||||||
----
|
----
|
||||||
|
|
||||||
6. (optional) Setup cgit to browse the Git repositories via HTTP.
|
6. Drop the category ID foreign key from the PackageBases table:
|
||||||
|
|
||||||
|
`ALTER TABLE PackageBases DROP FOREIGN KEY PackageBases_ibfk_1;` should
|
||||||
|
work in most cases. Otherwise, check the output of `SHOW CREATE TABLE
|
||||||
|
PackageBases;` and use the foreign key name shown there.
|
||||||
|
|
||||||
|
7. Replace the package base categories with keywords:
|
||||||
|
|
||||||
|
----
|
||||||
|
ALTER TABLE PackageBases DROP COLUMN CategoryID;
|
||||||
|
DROP TABLE PackageCategories;
|
||||||
|
|
||||||
|
CREATE TABLE PackageKeywords (
|
||||||
|
PackageBaseID INTEGER UNSIGNED NOT NULL,
|
||||||
|
Keyword VARCHAR(255) NOT NULL DEFAULT '',
|
||||||
|
PRIMARY KEY (PackageBaseID, Keyword),
|
||||||
|
FOREIGN KEY (PackageBaseID) REFERENCES PackageBases(ID) ON DELETE CASCADE
|
||||||
|
) ENGINE = InnoDB;
|
||||||
|
----
|
||||||
|
|
||||||
|
8. (optional) Setup cgit to browse the Git repositories via HTTP.
|
||||||
|
|
|
@ -96,8 +96,8 @@ if (check_token()) {
|
||||||
list($ret, $output) = pkgbase_notify($ids, false);
|
list($ret, $output) = pkgbase_notify($ids, false);
|
||||||
} elseif (current_action("do_DeleteComment")) {
|
} elseif (current_action("do_DeleteComment")) {
|
||||||
list($ret, $output) = pkgbase_delete_comment();
|
list($ret, $output) = pkgbase_delete_comment();
|
||||||
} elseif (current_action("do_ChangeCategory")) {
|
} elseif (current_action("do_SetKeywords")) {
|
||||||
list($ret, $output) = pkgbase_change_category($base_id);
|
list($ret, $output) = pkgbase_set_keywords($base_id, preg_split("/[\s,;]+/", $_POST['keywords'], -1, PREG_SPLIT_NO_EMPTY));
|
||||||
} elseif (current_action("do_FileRequest")) {
|
} elseif (current_action("do_FileRequest")) {
|
||||||
list($ret, $output) = pkgreq_file($ids, $_POST['type'], $_POST['merge_into'], $_POST['comments']);
|
list($ret, $output) = pkgreq_file($ids, $_POST['type'], $_POST['merge_into'], $_POST['comments']);
|
||||||
} elseif (current_action("do_CloseRequest")) {
|
} elseif (current_action("do_CloseRequest")) {
|
||||||
|
|
|
@ -19,7 +19,7 @@ class AurJSON {
|
||||||
private static $fields_v1 = array(
|
private static $fields_v1 = array(
|
||||||
'Packages.ID', 'Packages.Name',
|
'Packages.ID', 'Packages.Name',
|
||||||
'PackageBases.ID AS PackageBaseID',
|
'PackageBases.ID AS PackageBaseID',
|
||||||
'PackageBases.Name AS PackageBase', 'Version', 'CategoryID',
|
'PackageBases.Name AS PackageBase', 'Version',
|
||||||
'Description', 'URL', 'NumVotes', 'OutOfDateTS AS OutOfDate',
|
'Description', 'URL', 'NumVotes', 'OutOfDateTS AS OutOfDate',
|
||||||
'Users.UserName AS Maintainer',
|
'Users.UserName AS Maintainer',
|
||||||
'SubmittedTS AS FirstSubmitted', 'ModifiedTS AS LastModified',
|
'SubmittedTS AS FirstSubmitted', 'ModifiedTS AS LastModified',
|
||||||
|
@ -28,13 +28,13 @@ class AurJSON {
|
||||||
private static $fields_v2 = array(
|
private static $fields_v2 = array(
|
||||||
'Packages.ID', 'Packages.Name',
|
'Packages.ID', 'Packages.Name',
|
||||||
'PackageBases.ID AS PackageBaseID',
|
'PackageBases.ID AS PackageBaseID',
|
||||||
'PackageBases.Name AS PackageBase', 'Version', 'CategoryID',
|
'PackageBases.Name AS PackageBase', 'Version',
|
||||||
'Description', 'URL', 'NumVotes', 'OutOfDateTS AS OutOfDate',
|
'Description', 'URL', 'NumVotes', 'OutOfDateTS AS OutOfDate',
|
||||||
'Users.UserName AS Maintainer',
|
'Users.UserName AS Maintainer',
|
||||||
'SubmittedTS AS FirstSubmitted', 'ModifiedTS AS LastModified'
|
'SubmittedTS AS FirstSubmitted', 'ModifiedTS AS LastModified'
|
||||||
);
|
);
|
||||||
private static $numeric_fields = array(
|
private static $numeric_fields = array(
|
||||||
'ID', 'PackageBaseID', 'CategoryID', 'NumVotes', 'OutOfDate',
|
'ID', 'PackageBaseID', 'NumVotes', 'OutOfDate',
|
||||||
'FirstSubmitted', 'LastModified'
|
'FirstSubmitted', 'LastModified'
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ class AurJSON {
|
||||||
if (isset($http_data['v'])) {
|
if (isset($http_data['v'])) {
|
||||||
$this->version = intval($http_data['v']);
|
$this->version = intval($http_data['v']);
|
||||||
}
|
}
|
||||||
if ($this->version < 1 || $this->version > 3) {
|
if ($this->version < 1 || $this->version > 4) {
|
||||||
return $this->json_error('Invalid version specified.');
|
return $this->json_error('Invalid version specified.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -229,6 +229,9 @@ class AurJSON {
|
||||||
while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
|
while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
|
||||||
$resultcount++;
|
$resultcount++;
|
||||||
$row['URLPath'] = sprintf(config_get('options', 'snapshot_uri'), urlencode($row['PackageBase']));
|
$row['URLPath'] = sprintf(config_get('options', 'snapshot_uri'), urlencode($row['PackageBase']));
|
||||||
|
if ($this->version < 4) {
|
||||||
|
$row['CategoryID'] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Unfortunately, mysql_fetch_assoc() returns
|
* Unfortunately, mysql_fetch_assoc() returns
|
||||||
|
|
|
@ -8,7 +8,7 @@ define("CRED_ACCOUNT_SEARCH", 5);
|
||||||
define("CRED_COMMENT_DELETE", 6);
|
define("CRED_COMMENT_DELETE", 6);
|
||||||
define("CRED_COMMENT_VIEW_DELETED", 22);
|
define("CRED_COMMENT_VIEW_DELETED", 22);
|
||||||
define("CRED_PKGBASE_ADOPT", 7);
|
define("CRED_PKGBASE_ADOPT", 7);
|
||||||
define("CRED_PKGBASE_CHANGE_CATEGORY", 8);
|
define("CRED_PKGBASE_SET_KEYWORDS", 8);
|
||||||
define("CRED_PKGBASE_DELETE", 9);
|
define("CRED_PKGBASE_DELETE", 9);
|
||||||
define("CRED_PKGBASE_DISOWN", 10);
|
define("CRED_PKGBASE_DISOWN", 10);
|
||||||
define("CRED_PKGBASE_EDIT_COMAINTAINERS", 24);
|
define("CRED_PKGBASE_EDIT_COMAINTAINERS", 24);
|
||||||
|
@ -60,7 +60,7 @@ function has_credential($credential, $approved_users=array()) {
|
||||||
case CRED_COMMENT_DELETE:
|
case CRED_COMMENT_DELETE:
|
||||||
case CRED_COMMENT_VIEW_DELETED:
|
case CRED_COMMENT_VIEW_DELETED:
|
||||||
case CRED_PKGBASE_ADOPT:
|
case CRED_PKGBASE_ADOPT:
|
||||||
case CRED_PKGBASE_CHANGE_CATEGORY:
|
case CRED_PKGBASE_SET_KEYWORDS:
|
||||||
case CRED_PKGBASE_DELETE:
|
case CRED_PKGBASE_DELETE:
|
||||||
case CRED_PKGBASE_EDIT_COMAINTAINERS:
|
case CRED_PKGBASE_EDIT_COMAINTAINERS:
|
||||||
case CRED_PKGBASE_DISOWN:
|
case CRED_PKGBASE_DISOWN:
|
||||||
|
|
|
@ -2,25 +2,6 @@
|
||||||
|
|
||||||
include_once("pkgreqfuncs.inc.php");
|
include_once("pkgreqfuncs.inc.php");
|
||||||
|
|
||||||
/**
|
|
||||||
* Get all package categories stored in the database
|
|
||||||
*
|
|
||||||
* @param \PDO An already established database connection
|
|
||||||
*
|
|
||||||
* @return array All package categories
|
|
||||||
*/
|
|
||||||
function pkgbase_categories() {
|
|
||||||
$dbh = DB::connect();
|
|
||||||
$q = "SELECT * FROM PackageCategories WHERE ID != 1 ";
|
|
||||||
$q.= "ORDER BY Category ASC";
|
|
||||||
$result = $dbh->query($q);
|
|
||||||
if (!$result) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $result->fetchAll(PDO::FETCH_KEY_PAIR);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the number of non-deleted comments for a specific package base
|
* Get the number of non-deleted comments for a specific package base
|
||||||
*
|
*
|
||||||
|
@ -186,17 +167,15 @@ function pkgbase_get_details($base_id) {
|
||||||
$dbh = DB::connect();
|
$dbh = DB::connect();
|
||||||
|
|
||||||
$q = "SELECT PackageBases.ID, PackageBases.Name, ";
|
$q = "SELECT PackageBases.ID, PackageBases.Name, ";
|
||||||
$q.= "PackageBases.CategoryID, PackageBases.NumVotes, ";
|
$q.= "PackageBases.NumVotes, ";
|
||||||
$q.= "PackageBases.OutOfDateTS, PackageBases.SubmittedTS, ";
|
$q.= "PackageBases.OutOfDateTS, PackageBases.SubmittedTS, ";
|
||||||
$q.= "PackageBases.ModifiedTS, PackageBases.SubmitterUID, ";
|
$q.= "PackageBases.ModifiedTS, PackageBases.SubmitterUID, ";
|
||||||
$q.= "PackageBases.MaintainerUID, PackageBases.PackagerUID, ";
|
$q.= "PackageBases.MaintainerUID, PackageBases.PackagerUID, ";
|
||||||
$q.= "PackageCategories.Category, ";
|
|
||||||
$q.= "(SELECT COUNT(*) FROM PackageRequests ";
|
$q.= "(SELECT COUNT(*) FROM PackageRequests ";
|
||||||
$q.= " WHERE PackageRequests.PackageBaseID = PackageBases.ID ";
|
$q.= " WHERE PackageRequests.PackageBaseID = PackageBases.ID ";
|
||||||
$q.= " AND PackageRequests.Status = 0) AS RequestCount ";
|
$q.= " AND PackageRequests.Status = 0) AS RequestCount ";
|
||||||
$q.= "FROM PackageBases, PackageCategories ";
|
$q.= "FROM PackageBases ";
|
||||||
$q.= "WHERE PackageBases.CategoryID = PackageCategories.ID ";
|
$q.= "WHERE PackageBases.ID = " . intval($base_id);
|
||||||
$q.= "AND PackageBases.ID = " . intval($base_id);
|
|
||||||
$result = $dbh->query($q);
|
$result = $dbh->query($q);
|
||||||
|
|
||||||
$row = array();
|
$row = array();
|
||||||
|
@ -933,63 +912,62 @@ function pkgbase_delete_comment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Change package base category
|
* Get a list of package base keywords
|
||||||
*
|
*
|
||||||
* @param int Package base ID of the package base to modify
|
* @param int $base_id The package base ID to retrieve the keywords for
|
||||||
*
|
*
|
||||||
* @return array Tuple of success/failure indicator and error message
|
* @return array An array of keywords
|
||||||
*/
|
*/
|
||||||
function pkgbase_change_category($base_id) {
|
function pkgbase_get_keywords($base_id) {
|
||||||
$uid = uid_from_sid($_COOKIE["AURSID"]);
|
|
||||||
if (!$uid) {
|
|
||||||
return array(false, __("You must be logged in before you can edit package information."));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($_POST["category_id"])) {
|
|
||||||
$category_id = $_POST["category_id"];
|
|
||||||
} else {
|
|
||||||
return array(false, __("Missing category ID."));
|
|
||||||
}
|
|
||||||
|
|
||||||
$dbh = DB::connect();
|
$dbh = DB::connect();
|
||||||
$catArray = pkgbase_categories($dbh);
|
$q = "SELECT Keyword FROM PackageKeywords ";
|
||||||
if (!array_key_exists($category_id, $catArray)) {
|
$q .= "WHERE PackageBaseID = " . intval($base_id) . " ";
|
||||||
return array(false, __("Invalid category ID."));
|
$q .= "ORDER BY Keyword ASC";
|
||||||
}
|
|
||||||
|
|
||||||
$base_id = intval($base_id);
|
|
||||||
|
|
||||||
/* Verify package ownership. */
|
|
||||||
$q = "SELECT MaintainerUID FROM PackageBases WHERE ID = " . $base_id;
|
|
||||||
$result = $dbh->query($q);
|
$result = $dbh->query($q);
|
||||||
|
|
||||||
if ($result) {
|
if ($result) {
|
||||||
$row = $result->fetch(PDO::FETCH_ASSOC);
|
return $result->fetchAll(PDO::FETCH_COLUMN, 0);
|
||||||
|
} else {
|
||||||
|
return array();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$result || !has_credential(CRED_PKGBASE_CHANGE_CATEGORY, array($row["MaintainerUID"]))) {
|
|
||||||
return array(false, __("You are not allowed to change this package category."));
|
|
||||||
}
|
|
||||||
|
|
||||||
$q = "UPDATE PackageBases ";
|
|
||||||
$q.= "SET CategoryID = ".intval($category_id)." ";
|
|
||||||
$q.= "WHERE ID = ".intval($base_id);
|
|
||||||
$dbh->exec($q);
|
|
||||||
return array(true, __("Package category changed."));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Change the category a package base belongs to
|
* Update the list of keywords of a package base
|
||||||
*
|
*
|
||||||
* @param int $base_id The package base ID to change the category for
|
* @param int $base_id The package base ID to update the keywords of
|
||||||
* @param int $category_id The new category ID for the package
|
* @param array $users Array of keywords
|
||||||
*
|
*
|
||||||
* @return void
|
* @return array Tuple of success/failure indicator and error message
|
||||||
*/
|
*/
|
||||||
function pkgbase_update_category($base_id, $category_id) {
|
function pkgbase_set_keywords($base_id, $keywords) {
|
||||||
|
$base_id = intval($base_id);
|
||||||
|
|
||||||
|
if (!has_credential(CRED_PKGBASE_SET_KEYWORDS, array(pkgbase_maintainer_uid($base_id)))) {
|
||||||
|
return array(false, __("You are not allowed to edit the keywords of this package base."));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remove empty and duplicate user names. */
|
||||||
|
$keywords = array_unique(array_filter(array_map('trim', $keywords)));
|
||||||
|
|
||||||
$dbh = DB::connect();
|
$dbh = DB::connect();
|
||||||
$q = sprintf("UPDATE PackageBases SET CategoryID = %d WHERE ID = %d",
|
|
||||||
$category_id, $base_id);
|
$q = sprintf("DELETE FROM PackageKeywords WHERE PackageBaseID = %d", $base_id);
|
||||||
$dbh->exec($q);
|
$dbh->exec($q);
|
||||||
|
|
||||||
|
$i = 0;
|
||||||
|
foreach ($keywords as $keyword) {
|
||||||
|
$q = sprintf("INSERT INTO PackageKeywords (PackageBaseID, Keyword) VALUES (%d, %s)", $base_id, $dbh->quote($keyword));
|
||||||
|
var_dump($q);
|
||||||
|
$dbh->exec($q);
|
||||||
|
|
||||||
|
$i++;
|
||||||
|
if ($i >= 20) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return array(true, __("The package base keywords have been updated."));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -400,17 +400,16 @@ function pkg_get_details($id=0) {
|
||||||
$dbh = DB::connect();
|
$dbh = DB::connect();
|
||||||
|
|
||||||
$q = "SELECT Packages.*, PackageBases.ID AS BaseID, ";
|
$q = "SELECT Packages.*, PackageBases.ID AS BaseID, ";
|
||||||
$q.= "PackageBases.Name AS BaseName, PackageBases.CategoryID, ";
|
$q.= "PackageBases.Name AS BaseName, ";
|
||||||
$q.= "PackageBases.NumVotes, PackageBases.OutOfDateTS, ";
|
$q.= "PackageBases.NumVotes, PackageBases.OutOfDateTS, ";
|
||||||
$q.= "PackageBases.SubmittedTS, PackageBases.ModifiedTS, ";
|
$q.= "PackageBases.SubmittedTS, PackageBases.ModifiedTS, ";
|
||||||
$q.= "PackageBases.SubmitterUID, PackageBases.MaintainerUID, ";
|
$q.= "PackageBases.SubmitterUID, PackageBases.MaintainerUID, ";
|
||||||
$q.= "PackageBases.PackagerUID, PackageCategories.Category, ";
|
$q.= "PackageBases.PackagerUID, ";
|
||||||
$q.= "(SELECT COUNT(*) FROM PackageRequests ";
|
$q.= "(SELECT COUNT(*) FROM PackageRequests ";
|
||||||
$q.= " WHERE PackageRequests.PackageBaseID = Packages.PackageBaseID ";
|
$q.= " WHERE PackageRequests.PackageBaseID = Packages.PackageBaseID ";
|
||||||
$q.= " AND PackageRequests.Status = 0) AS RequestCount ";
|
$q.= " AND PackageRequests.Status = 0) AS RequestCount ";
|
||||||
$q.= "FROM Packages, PackageBases, PackageCategories ";
|
$q.= "FROM Packages, PackageBases ";
|
||||||
$q.= "WHERE PackageBases.ID = Packages.PackageBaseID ";
|
$q.= "WHERE PackageBases.ID = Packages.PackageBaseID ";
|
||||||
$q.= "AND PackageBases.CategoryID = PackageCategories.ID ";
|
|
||||||
$q.= "AND Packages.ID = " . intval($id);
|
$q.= "AND Packages.ID = " . intval($id);
|
||||||
$result = $dbh->query($q);
|
$result = $dbh->query($q);
|
||||||
|
|
||||||
|
@ -475,14 +474,12 @@ function pkg_display_details($id=0, $row, $SID="") {
|
||||||
* request vars:
|
* request vars:
|
||||||
* O - starting result number
|
* O - starting result number
|
||||||
* PP - number of search hits per page
|
* PP - number of search hits per page
|
||||||
* C - package category ID number
|
|
||||||
* K - package search string
|
* K - package search string
|
||||||
* SO - search hit sort order:
|
* SO - search hit sort order:
|
||||||
* values: a - ascending
|
* values: a - ascending
|
||||||
* d - descending
|
* d - descending
|
||||||
* SB - sort search hits by:
|
* SB - sort search hits by:
|
||||||
* values: c - package category
|
* values: n - package name
|
||||||
* n - package name
|
|
||||||
* v - number of votes
|
* v - number of votes
|
||||||
* m - maintainer username
|
* m - maintainer username
|
||||||
* SeB- property that search string (K) represents
|
* SeB- property that search string (K) represents
|
||||||
|
@ -516,7 +513,6 @@ function pkg_search_page($SID="") {
|
||||||
*/
|
*/
|
||||||
if ($SID)
|
if ($SID)
|
||||||
$myuid = uid_from_sid($SID);
|
$myuid = uid_from_sid($SID);
|
||||||
$cats = pkgbase_categories($dbh);
|
|
||||||
|
|
||||||
/* Sanitize paging variables. */
|
/* Sanitize paging variables. */
|
||||||
if (isset($_GET['O'])) {
|
if (isset($_GET['O'])) {
|
||||||
|
@ -543,16 +539,13 @@ function pkg_search_page($SID="") {
|
||||||
PackageVotes.UsersID AS Voted, ";
|
PackageVotes.UsersID AS Voted, ";
|
||||||
}
|
}
|
||||||
$q_select .= "Users.Username AS Maintainer,
|
$q_select .= "Users.Username AS Maintainer,
|
||||||
PackageCategories.Category,
|
|
||||||
Packages.Name, Packages.Version, Packages.Description,
|
Packages.Name, Packages.Version, Packages.Description,
|
||||||
PackageBases.NumVotes, PackageBases.Popularity, Packages.ID,
|
PackageBases.NumVotes, PackageBases.Popularity, Packages.ID,
|
||||||
Packages.PackageBaseID, PackageBases.OutOfDateTS ";
|
Packages.PackageBaseID, PackageBases.OutOfDateTS ";
|
||||||
|
|
||||||
$q_from = "FROM Packages
|
$q_from = "FROM Packages
|
||||||
LEFT JOIN PackageBases ON (PackageBases.ID = Packages.PackageBaseID)
|
LEFT JOIN PackageBases ON (PackageBases.ID = Packages.PackageBaseID)
|
||||||
LEFT JOIN Users ON (PackageBases.MaintainerUID = Users.ID)
|
LEFT JOIN Users ON (PackageBases.MaintainerUID = Users.ID) ";
|
||||||
LEFT JOIN PackageCategories
|
|
||||||
ON (PackageBases.CategoryID = PackageCategories.ID) ";
|
|
||||||
if ($SID) {
|
if ($SID) {
|
||||||
/* This is not needed for the total row count query. */
|
/* This is not needed for the total row count query. */
|
||||||
$q_from_extra = "LEFT JOIN PackageVotes
|
$q_from_extra = "LEFT JOIN PackageVotes
|
||||||
|
@ -564,13 +557,6 @@ function pkg_search_page($SID="") {
|
||||||
}
|
}
|
||||||
|
|
||||||
$q_where = 'WHERE PackageBases.PackagerUID IS NOT NULL ';
|
$q_where = 'WHERE PackageBases.PackagerUID IS NOT NULL ';
|
||||||
/*
|
|
||||||
* TODO: Possibly do string matching on category to make request
|
|
||||||
* variable values more sensible.
|
|
||||||
*/
|
|
||||||
if (isset($_GET["C"]) && intval($_GET["C"])) {
|
|
||||||
$q_where .= "AND PackageBases.CategoryID = ".intval($_GET["C"])." ";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($_GET['K'])) {
|
if (isset($_GET['K'])) {
|
||||||
if (isset($_GET["SeB"]) && $_GET["SeB"] == "m") {
|
if (isset($_GET["SeB"]) && $_GET["SeB"] == "m") {
|
||||||
|
@ -600,7 +586,7 @@ function pkg_search_page($SID="") {
|
||||||
$q_where .= "AND (PackageBases.Name = " . $dbh->quote($_GET['K']) . ") ";
|
$q_where .= "AND (PackageBases.Name = " . $dbh->quote($_GET['K']) . ") ";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* Search by name and description (default). */
|
/* Keyword search (default). */
|
||||||
$count = 0;
|
$count = 0;
|
||||||
$q_keywords = "";
|
$q_keywords = "";
|
||||||
$op = "";
|
$op = "";
|
||||||
|
@ -624,7 +610,10 @@ function pkg_search_page($SID="") {
|
||||||
|
|
||||||
$term = "%" . addcslashes($term, '%_') . "%";
|
$term = "%" . addcslashes($term, '%_') . "%";
|
||||||
$q_keywords .= $op . " (Packages.Name LIKE " . $dbh->quote($term) . " OR ";
|
$q_keywords .= $op . " (Packages.Name LIKE " . $dbh->quote($term) . " OR ";
|
||||||
$q_keywords .= "Description LIKE " . $dbh->quote($term) . ") ";
|
$q_keywords .= "Description LIKE " . $dbh->quote($term) . " OR ";
|
||||||
|
$q_keywords .= "EXISTS (SELECT * FROM PackageKeywords WHERE ";
|
||||||
|
$q_keywords .= "PackageKeywords.PackageBaseID = Packages.PackageBaseID AND ";
|
||||||
|
$q_keywords .= "PackageKeywords.Keyword LIKE " . $dbh->quote($term) . ")) ";
|
||||||
|
|
||||||
$count++;
|
$count++;
|
||||||
if ($count >= 20) {
|
if ($count >= 20) {
|
||||||
|
@ -657,9 +646,6 @@ function pkg_search_page($SID="") {
|
||||||
$q_sort = "ORDER BY ";
|
$q_sort = "ORDER BY ";
|
||||||
$sort_by = isset($_GET["SB"]) ? $_GET["SB"] : '';
|
$sort_by = isset($_GET["SB"]) ? $_GET["SB"] : '';
|
||||||
switch ($sort_by) {
|
switch ($sort_by) {
|
||||||
case 'c':
|
|
||||||
$q_sort .= "CategoryID " . $order . ", ";
|
|
||||||
break;
|
|
||||||
case 'v':
|
case 'v':
|
||||||
$q_sort .= "NumVotes " . $order . ", ";
|
$q_sort .= "NumVotes " . $order . ", ";
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -11,7 +11,7 @@ $uid = uid_from_sid($SID);
|
||||||
$pkgid = intval($row['ID']);
|
$pkgid = intval($row['ID']);
|
||||||
$base_id = intval($row['BaseID']);
|
$base_id = intval($row['BaseID']);
|
||||||
|
|
||||||
$catarr = pkgbase_categories();
|
$keywords = pkgbase_get_keywords($base_id);
|
||||||
|
|
||||||
$submitter = username_from_id($row["SubmitterUID"]);
|
$submitter = username_from_id($row["SubmitterUID"]);
|
||||||
$maintainer = username_from_id($row["MaintainerUID"]);
|
$maintainer = username_from_id($row["MaintainerUID"]);
|
||||||
|
@ -188,34 +188,25 @@ $sources = pkg_sources($row["ID"]);
|
||||||
<th><?= __('Upstream URL') . ': ' ?></th>
|
<th><?= __('Upstream URL') . ': ' ?></th>
|
||||||
<td><a href="<?= htmlspecialchars($row['URL'], ENT_QUOTES) ?>" title="<?= __('Visit the website for') . ' ' . htmlspecialchars( $row['Name'])?>"><?= htmlspecialchars($row['URL'], ENT_QUOTES) ?></a></td>
|
<td><a href="<?= htmlspecialchars($row['URL'], ENT_QUOTES) ?>" title="<?= __('Visit the website for') . ' ' . htmlspecialchars( $row['Name'])?>"><?= htmlspecialchars($row['URL'], ENT_QUOTES) ?></a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
|
||||||
<th><?= __('Category') . ': ' ?></th>
|
|
||||||
<?php
|
<?php
|
||||||
if (has_credential(CRED_PKGBASE_CHANGE_CATEGORY, array($row["MaintainerUID"]))):
|
if (has_credential(CRED_PKGBASE_SET_KEYWORDS, array($row["MaintainerUID"]))):
|
||||||
?>
|
?>
|
||||||
|
<tr>
|
||||||
|
<th><?= __('Keywords') . ': ' ?></th>
|
||||||
<td>
|
<td>
|
||||||
<form method="post" action="<?= htmlspecialchars(get_pkgbase_uri($row['BaseName']), ENT_QUOTES); ?>">
|
<form method="post" action="<?= htmlspecialchars(get_pkgbase_uri($row['BaseName']), ENT_QUOTES); ?>">
|
||||||
<div>
|
<div>
|
||||||
<input type="hidden" name="action" value="do_ChangeCategory" />
|
<input type="hidden" name="action" value="do_SetKeywords" />
|
||||||
<?php if ($SID): ?>
|
<?php if ($SID): ?>
|
||||||
<input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
|
<input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<select name="category_id">
|
<input type="text" name="keywords" value="<?= htmlspecialchars(implode(" ", $keywords), ENT_QUOTES) ?>"/>
|
||||||
<?php
|
<input type="submit" value="<?= __('Update') ?>"/>
|
||||||
foreach ($catarr as $cid => $catname):
|
|
||||||
?>
|
|
||||||
<option value="<?= $cid ?>"<?php if ($cid == $row["CategoryID"]) { ?> selected="selected" <?php } ?>><?= $catname ?></option>
|
|
||||||
<?php endforeach; ?>
|
|
||||||
</select>
|
|
||||||
<input type="submit" value="<?= __('Change category') ?>"/>
|
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
<?php else: ?>
|
|
||||||
<td>
|
|
||||||
<a href="<?= get_uri('/packages/'); ?>?C=<?= $row['CategoryID'] ?>"><?= $row['Category'] ?></a>
|
|
||||||
<?php endif; ?>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<?php endif; ?>
|
||||||
<?php if (count($lics) > 0): ?>
|
<?php if (count($lics) > 0): ?>
|
||||||
<tr>
|
<tr>
|
||||||
<th><?= __('Licenses') . ': ' ?></th>
|
<th><?= __('Licenses') . ': ' ?></th>
|
||||||
|
|
|
@ -19,7 +19,6 @@ $outdated_flags = array(
|
||||||
|
|
||||||
$sortby = array(
|
$sortby = array(
|
||||||
'n' => __('Name'),
|
'n' => __('Name'),
|
||||||
'c' => __('Category'),
|
|
||||||
'v' => __('Votes'),
|
'v' => __('Votes'),
|
||||||
'p' => __('Popularity'),
|
'p' => __('Popularity'),
|
||||||
'w' => __('Voted'),
|
'w' => __('Voted'),
|
||||||
|
@ -44,19 +43,6 @@ $per_page = array(50, 100, 250);
|
||||||
|
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<legend><?= __('Enter search criteria') ?></legend>
|
<legend><?= __('Enter search criteria') ?></legend>
|
||||||
<div>
|
|
||||||
<label for="id_category"><?= __("Category"); ?></label>
|
|
||||||
<select name='C' id="id_category">
|
|
||||||
<option value='0'><?= __("Any"); ?></option>
|
|
||||||
<?php foreach (pkgbase_categories() as $id => $cat): ?>
|
|
||||||
<?php if (isset($_REQUEST['C']) && $_REQUEST['C'] == $id): ?>
|
|
||||||
<option value="<?= $id ?>" selected="selected"><?= $cat; ?></option>
|
|
||||||
<?php else: ?>
|
|
||||||
<option value="<?= $id ?>"><?= $cat; ?></option>
|
|
||||||
<?php endif; ?>
|
|
||||||
<?php endforeach; ?>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div>
|
<div>
|
||||||
<label for="id_method"><?= __("Search by"); ?></label>
|
<label for="id_method"><?= __("Search by"); ?></label>
|
||||||
<select name='SeB'>
|
<select name='SeB'>
|
||||||
|
|
|
@ -32,7 +32,6 @@ if (!$result): ?>
|
||||||
<?php if ($SID): ?>
|
<?php if ($SID): ?>
|
||||||
<th> </th>
|
<th> </th>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<th><a href="?<?= mkurl('SB=c&SO=' . $SO_next) ?>"><?= __("Category") ?></a></th>
|
|
||||||
<th><a href="?<?= mkurl('SB=n&SO=' . $SO_next) ?>"><?= __("Name") ?></a></th>
|
<th><a href="?<?= mkurl('SB=n&SO=' . $SO_next) ?>"><?= __("Name") ?></a></th>
|
||||||
<th><?= __("Version") ?></th>
|
<th><?= __("Version") ?></th>
|
||||||
<th><a href="?<?= mkurl('SB=v&SO=' . $SO_next) ?>"><?= __("Votes") ?></a></th>
|
<th><a href="?<?= mkurl('SB=v&SO=' . $SO_next) ?>"><?= __("Votes") ?></a></th>
|
||||||
|
@ -52,7 +51,6 @@ if (!$result): ?>
|
||||||
<?php if ($SID): ?>
|
<?php if ($SID): ?>
|
||||||
<td><input type="checkbox" name="IDs[<?= $row["PackageBaseID"] ?>]" value="1" /></td>
|
<td><input type="checkbox" name="IDs[<?= $row["PackageBaseID"] ?>]" value="1" /></td>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<td><?= htmlspecialchars($row["Category"]) ?></td>
|
|
||||||
<td><a href="<?= htmlspecialchars(get_pkg_uri($row["Name"]), ENT_QUOTES); ?>"><?= htmlspecialchars($row["Name"]) ?></a></td>
|
<td><a href="<?= htmlspecialchars(get_pkg_uri($row["Name"]), ENT_QUOTES); ?>"><?= htmlspecialchars($row["Name"]) ?></a></td>
|
||||||
<td<?php if ($row["OutOfDateTS"]): ?> class="flagged"<?php endif; ?>><?= htmlspecialchars($row["Version"]) ?></td>
|
<td<?php if ($row["OutOfDateTS"]): ?> class="flagged"<?php endif; ?>><?= htmlspecialchars($row["Version"]) ?></td>
|
||||||
<td><?= $row["NumVotes"] ?></td>
|
<td><?= $row["NumVotes"] ?></td>
|
||||||
|
|
|
@ -10,7 +10,7 @@ $uid = uid_from_sid($SID);
|
||||||
|
|
||||||
$base_id = intval($row['ID']);
|
$base_id = intval($row['ID']);
|
||||||
|
|
||||||
$catarr = pkgbase_categories();
|
$keywords = pkgbase_get_keywords($base_id);
|
||||||
|
|
||||||
$submitter = username_from_id($row["SubmitterUID"]);
|
$submitter = username_from_id($row["SubmitterUID"]);
|
||||||
$maintainer = username_from_id($row["MaintainerUID"]);
|
$maintainer = username_from_id($row["MaintainerUID"]);
|
||||||
|
@ -127,34 +127,25 @@ $pkgs = pkgbase_get_pkgnames($base_id);
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
|
||||||
<th><?= __('Category') . ': ' ?></th>
|
|
||||||
<?php
|
<?php
|
||||||
if (has_credential(CRED_PKGBASE_CHANGE_CATEGORY, array($row["MaintainerUID"]))):
|
if (has_credential(CRED_PKGBASE_SET_KEYWORDS, array($row["MaintainerUID"]))):
|
||||||
?>
|
?>
|
||||||
|
<tr>
|
||||||
|
<th><?= __('Keywords') . ': ' ?></th>
|
||||||
<td>
|
<td>
|
||||||
<form method="post" action="<?= htmlspecialchars(get_pkgbase_uri($row['Name']), ENT_QUOTES); ?>">
|
<form method="post" action="<?= htmlspecialchars(get_pkgbase_uri($row['Name']), ENT_QUOTES); ?>">
|
||||||
<div>
|
<div>
|
||||||
<input type="hidden" name="action" value="do_ChangeCategory" />
|
<input type="hidden" name="action" value="do_SetKeywords" />
|
||||||
<?php if ($SID): ?>
|
<?php if ($SID): ?>
|
||||||
<input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
|
<input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<select name="category_id">
|
<input type="text" name="keywords" value="<?= htmlspecialchars(implode(" ", $keywords), ENT_QUOTES) ?>"/>
|
||||||
<?php
|
<input type="submit" value="<?= __('Update') ?>"/>
|
||||||
foreach ($catarr as $cid => $catname):
|
|
||||||
?>
|
|
||||||
<option value="<?= $cid ?>"<?php if ($cid == $row["CategoryID"]) { ?> selected="selected" <?php } ?>><?= $catname ?></option>
|
|
||||||
<?php endforeach; ?>
|
|
||||||
</select>
|
|
||||||
<input type="submit" value="<?= __('Change category') ?>"/>
|
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
<?php else: ?>
|
|
||||||
<td>
|
|
||||||
<a href="<?= get_uri('/packages/'); ?>?C=<?= $row['CategoryID'] ?>"><?= $row['Category'] ?></a>
|
|
||||||
<?php endif; ?>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<?php endif; ?>
|
||||||
<tr>
|
<tr>
|
||||||
<th><?= __('Submitter') .': ' ?></th>
|
<th><?= __('Submitter') .': ' ?></th>
|
||||||
<?php if ($row["SubmitterUID"] && $SID): ?>
|
<?php if ($row["SubmitterUID"] && $SID): ?>
|
||||||
|
|
Loading…
Add table
Reference in a new issue