[aur-dev] [PATCH 06/13] Add package base detail pages

Lukas Fleischer archlinux at cryptocrack.de
Sat Apr 5 07:59:46 EDT 2014


This adds package base details pages, similar to the package details
pages. Each package base details page contains general information
(package base name, category, submitter, maintainer, ...) and links to
all the corresponding packages. As on the package details pages,
comments and links to several package actions are also provided.

Signed-off-by: Lukas Fleischer <archlinux at cryptocrack.de>
---
 web/html/index.php               |  16 +++
 web/html/pkgbase.php             |  55 ++++++++++
 web/lib/pkgfuncs.inc.php         |  84 ++++++++++++++++
 web/lib/routing.inc.php          |  16 ++-
 web/template/pkgbase_details.php | 210 +++++++++++++++++++++++++++++++++++++++
 5 files changed, 380 insertions(+), 1 deletion(-)
 create mode 100644 web/html/pkgbase.php
 create mode 100644 web/template/pkgbase_details.php

diff --git a/web/html/index.php b/web/html/index.php
index 542d594..e79955e 100644
--- a/web/html/index.php
+++ b/web/html/index.php
@@ -70,6 +70,22 @@ if (!empty($tokens[1]) && '/' . $tokens[1] == get_pkg_route()) {
 	}
 
 	include get_route('/' . $tokens[1]);
+} elseif (!empty($tokens[1]) && '/' . $tokens[1] == get_pkgbase_route()) {
+	if (!empty($tokens[2])) {
+		/* TODO: Create a proper data structure to pass variables from
+		 * the routing framework to the individual pages instead of
+		 * initializing arbitrary variables here. */
+		$pkgbase_name = $tokens[2];
+		$base_id = pkgbase_from_name($pkgbase_name);
+
+		if (!$base_id) {
+			header("HTTP/1.0 404 Not Found");
+			include "./404.php";
+			return;
+		}
+	}
+
+	include get_route('/' . $tokens[1]);
 } elseif (!empty($tokens[1]) && '/' . $tokens[1] == get_user_route()) {
 	if (!empty($tokens[2])) {
 		$_REQUEST['ID'] = uid_from_username($tokens[2]);
diff --git a/web/html/pkgbase.php b/web/html/pkgbase.php
new file mode 100644
index 0000000..e0c9af6
--- /dev/null
+++ b/web/html/pkgbase.php
@@ -0,0 +1,55 @@
+<?php
+
+set_include_path(get_include_path() . PATH_SEPARATOR . '../lib');
+
+include_once("aur.inc.php");
+set_lang();
+include_once('pkgfuncs.inc.php');
+check_sid();
+
+/*
+ * Retrieve package base ID and name, unless initialized by the routing
+ * framework.
+ */
+if (!isset($base_id) || !isset($pkgbase_name)) {
+	if (isset($_GET['ID'])) {
+		$base_id = intval($_GET['ID']);
+		$pkgbase_name = pkgbase_name_from_id($_GET['ID']);
+	} else if (isset($_GET['N'])) {
+		$base_id = pkgbase_from_name($_GET['N']);
+		$pkgbase_name = $_GET['N'];
+	} else {
+		unset($base_id, $pkgbase_name);
+	}
+
+	if ($base_id == 0 || $base_id == NULL || $pkgbase_name == NULL) {
+		header("HTTP/1.0 404 Not Found");
+		include "./404.php";
+		return;
+	}
+}
+
+/* Set the title to package base name. */
+$title = $pkgbase_name;
+
+/* Retrieve account type. */
+if (isset($_COOKIE["AURSID"])) {
+	$atype = account_from_sid($_COOKIE["AURSID"]);
+} else {
+	$atype = "";
+}
+
+$details = get_pkgbase_details($base_id);
+html_header($title, $details);
+?>
+
+<?php
+include('pkg_search_form.php');
+if (isset($_COOKIE["AURSID"])) {
+	display_pkgbase_details($base_id, $details, $_COOKIE["AURSID"]);
+} else {
+	display_pkgbase_details($base_id, $details, null);
+}
+
+html_footer(AUR_VERSION);
+
diff --git a/web/lib/pkgfuncs.inc.php b/web/lib/pkgfuncs.inc.php
index 3ef069c..b92eb9c 100644
--- a/web/lib/pkgfuncs.inc.php
+++ b/web/lib/pkgfuncs.inc.php
@@ -445,6 +445,41 @@ function get_package_details($id=0) {
 }
 
 /**
+ * Get the package base details
+ *
+ * @param string $id The package base ID to get description for
+ *
+ * @return array The package base's details OR error message
+ **/
+function get_pkgbase_details($base_id) {
+	$dbh = DB::connect();
+
+	$q = "SELECT PackageBases.ID, PackageBases.Name, ";
+	$q.= "PackageBases.CategoryID, PackageBases.NumVotes, ";
+	$q.= "PackageBases.OutOfDateTS, PackageBases.SubmittedTS, ";
+	$q.= "PackageBases.ModifiedTS, PackageBases.SubmitterUID, ";
+	$q.= "PackageBases.MaintainerUID, PackageCategories.Category ";
+	$q.= "FROM PackageBases, PackageCategories ";
+	$q.= "WHERE PackageBases.CategoryID = PackageCategories.ID ";
+	$q.= "AND PackageBases.ID = " . intval($base_id);
+	$result = $dbh->query($q);
+
+	$row = array();
+
+	if (!$result) {
+		$row['error'] = __("Error retrieving package details.");
+	}
+	else {
+		$row = $result->fetch(PDO::FETCH_ASSOC);
+		if (empty($row)) {
+			$row['error'] = __("Package details could not be found.");
+		}
+	}
+
+	return $row;
+}
+
+/**
  * Display the package details page
  *
  * @global string $AUR_LOCATION The AUR's URL used for notification e-mails
@@ -480,6 +515,41 @@ function display_package_details($id=0, $row, $SID="") {
 	}
 }
 
+/**
+ * Display the package base details page
+ *
+ * @global string $AUR_LOCATION The AUR's URL used for notification e-mails
+ * @global bool $USE_VIRTUAL_URLS True if using URL rewriting, otherwise false
+ * @param string $id The package base ID to get details page for
+ * @param array $row Package base details retrieved by get_pkgbase_details
+ * @param string $SID The session ID of the visitor
+ *
+ * @return void
+ */
+function display_pkgbase_details($base_id, $row, $SID="") {
+	global $AUR_LOCATION;
+	global $USE_VIRTUAL_URLS;
+
+	$dbh = DB::connect();
+
+	if (isset($row['error'])) {
+		print "<p>" . $row['error'] . "</p>\n";
+	}
+	else {
+		include('pkgbase_details.php');
+
+		if ($SID) {
+			include('actions_form.php');
+			include('pkg_comment_form.php');
+		}
+
+		$comments = package_comments($base_id);
+		if (!empty($comments)) {
+			include('pkg_comments.php');
+		}
+	}
+}
+
 
 /* pkg_search_page(SID)
  * outputs the body of search/search results page
@@ -816,6 +886,20 @@ function pkgbase_name_from_id($base_id) {
 }
 
 /**
+ * Get the names of all packages belonging to a package base
+ *
+ * @param int $base_id The ID of the package base
+ *
+ * @return array The names of all packages belonging to the package base
+ */
+function pkgbase_get_pkgnames($base_id) {
+	$dbh = DB::connect();
+	$q = "SELECT Name FROM Packages WHERE PackageBaseID = " . intval($base_id);
+	$result = $dbh->query($q);
+	return $result->fetchAll(PDO::FETCH_COLUMN, 0);
+}
+
+/**
  * Delete all packages belonging to a package base
  *
  * @param int $base_id The ID of the package base
diff --git a/web/lib/routing.inc.php b/web/lib/routing.inc.php
index b1e5be2..1b2aa52 100644
--- a/web/lib/routing.inc.php
+++ b/web/lib/routing.inc.php
@@ -4,6 +4,7 @@ $ROUTES = array(
 	'' => 'home.php',
 	'/index.php' => 'home.php',
 	'/packages' => 'packages.php',
+	'/pkgbase' => 'pkgbase.php',
 	'/register' => 'account.php',
 	'/account' => 'account.php',
 	'/accounts' => 'account.php',
@@ -18,6 +19,7 @@ $ROUTES = array(
 );
 
 $PKG_PATH = '/packages';
+$PKGBASE_PATH = '/pkgbase';
 $USER_PATH = '/account';
 
 function get_route($path) {
@@ -47,6 +49,11 @@ function get_pkg_route() {
 	return $PKG_PATH;
 }
 
+function get_pkgbase_route() {
+	global $PKGBASE_PATH;
+	return $PKGBASE_PATH;
+}
+
 function get_pkg_uri($pkgname) {
 	global $USE_VIRTUAL_URLS;
 	global $PKG_PATH;
@@ -59,7 +66,14 @@ function get_pkg_uri($pkgname) {
 }
 
 function get_pkgbase_uri($pkgbase_name) {
-	return get_pkg_uri($pkgbase_name);
+	global $USE_VIRTUAL_URLS;
+	global $PKGBASE_PATH;
+
+	if ($USE_VIRTUAL_URLS) {
+		return $PKGBASE_PATH . '/' . urlencode($pkgbase_name) . '/';
+	} else {
+		return '/' . get_route($PKGBASE_PATH) . '?N=' . urlencode($pkgbase_name);
+	}
 }
 
 function get_user_route() {
diff --git a/web/template/pkgbase_details.php b/web/template/pkgbase_details.php
new file mode 100644
index 0000000..a77ecd3
--- /dev/null
+++ b/web/template/pkgbase_details.php
@@ -0,0 +1,210 @@
+<?php
+$atype = account_from_sid($SID);
+$uid = uid_from_sid($SID);
+
+$base_id = intval($row['ID']);
+
+$catarr = pkgCategories();
+
+$submitter = username_from_id($row["SubmitterUID"]);
+$maintainer = username_from_id($row["MaintainerUID"]);
+
+$votes = $row['NumVotes'];
+
+# In case of wanting to put a custom message
+$msg = __('unknown');
+
+# Print the timestamps for last updates
+$updated_time = ($row["ModifiedTS"] == 0) ? $msg : gmdate("Y-m-d H:i", intval($row["ModifiedTS"]));
+$submitted_time = ($row["SubmittedTS"] == 0) ? $msg : gmdate("Y-m-d H:i", intval($row["SubmittedTS"]));
+$out_of_date_time = ($row["OutOfDateTS"] == 0) ? $msg : gmdate("Y-m-d", intval($row["OutOfDateTS"]));
+
+$urlpath = URL_DIR . substr($row['Name'], 0, 2) . "/" . $row['Name'];
+
+$pkgs = pkgbase_get_pkgnames($base_id);
+?>
+<div id="pkgdetails" class="box">
+	<h2><?= __('Package Base Details') . ': ' . htmlspecialchars($row['Name']) ?></h2>
+	<div id="detailslinks" class="listing">
+		<div id="actionlist">
+			<h4><?= __('Package Actions') ?></h4>
+			<ul class="small">
+				<li><a href="<?= $urlpath ?>/PKGBUILD"><?= __('View PKGBUILD') ?></a></li>
+				<li><a href="<?= $urlpath . '/' . $pkgs[0] ?>.tar.gz"><?= __('Download tarball') ?></a></li>
+				<li><span class="flagged"><?php if ($row["OutOfDateTS"] !== NULL) { echo __('Flagged out-of-date')." (${out_of_date_time})"; } ?></span></li>
+				<?php if ($USE_VIRTUAL_URLS && $uid): ?>
+				<?php if ($row["OutOfDateTS"] === NULL): ?>
+				<li>
+					<form action="<?= get_pkg_uri($pkgs[0]) . 'flag/'; ?>" method="post">
+						<input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
+						<input type="submit" class="button text-button" name="do_Flag" value="<?= __('Flag package out-of-date') ?>" />
+					</form>
+				</li>
+				<?php elseif (($row["OutOfDateTS"] !== NULL) &&
+				($uid == $row["MaintainerUID"] || $atype == "Trusted User" || $atype == "Developer")): ?>
+				<li>
+					<form action="<?= get_pkg_uri($pkgs[0]) . 'unflag/'; ?>" method="post">
+						<input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
+						<input type="submit" class="button text-button" name="do_UnFlag" value="<?= __('Unflag package') ?>" />
+					</form>
+				</li>
+				<?php endif; ?>
+				<?php if (user_voted($uid, $row['ID'])): ?>
+				<li>
+					<form action="<?= get_pkg_uri($pkgs[0]) . 'unvote/'; ?>" method="post">
+						<input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
+						<input type="submit" class="button text-button" name="do_UnVote" value="<?= __('Remove vote') ?>" />
+					</form>
+				</li>
+				<?php else: ?>
+				<li>
+					<form action="<?= get_pkg_uri($pkgs[0]) . 'vote/'; ?>" method="post">
+						<input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
+						<input type="submit" class="button text-button" name="do_Vote" value="<?= __('Vote for this package') ?>" />
+					</form>
+				</li>
+				<?php endif; ?>
+				<?php if (user_notify($uid, $row['ID'])): ?>
+				<li>
+					<form action="<?= get_pkg_uri($pkgs[0]) . 'unnotify/'; ?>" method="post">
+						<input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
+						<input type="submit" class="button text-button" name="do_UnNotify" value="<?= __('Disable notifications') ?>" />
+					</form>
+				</li>
+				<?php else: ?>
+				<li>
+					<form action="<?= get_pkg_uri($pkgs[0]) . 'notify/'; ?>" method="post">
+						<input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
+						<input type="submit" class="button text-button" name="do_Notify" value="<?= __('Notify of new comments') ?>" />
+					</form>
+				</li>
+				<?php endif; ?>
+				<?php if ($atype == "Trusted User" || $atype == "Developer"): ?>
+				<li><a href="<?= get_pkg_uri($pkgs[0]) . 'delete/'; ?>"><?= __('Delete Package'); ?></a></li>
+				<li><a href="<?= get_pkg_uri($pkgs[0]) . 'merge/'; ?>"><?= __('Merge Package'); ?></a></li>
+				<?php endif; ?>
+				<?php endif; ?>
+
+				<?php if ($uid && $row["MaintainerUID"] === NULL): ?>
+				<li>
+					<form action="<?= get_pkg_uri($pkgs[0]) . 'adopt/'; ?>" method="post">
+						<input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
+						<input type="submit" class="button text-button" name="do_Adopt" value="<?= __('Adopt Package') ?>" />
+					</form>
+				</li>
+				<?php elseif ($uid && $uid == $row["MaintainerUID"] ||
+					$atype == "Trusted User" || $atype == "Developer"): ?>
+				<li>
+					<form action="<?= get_pkg_uri($pkgs[0]) . 'disown/'; ?>" method="post">
+						<input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
+						<input type="submit" class="button text-button" name="do_Disown" value="<?= __('Disown Package') ?>" />
+					</form>
+				</li>
+				<?php endif; ?>
+			</ul>
+		</div>
+	</div>
+
+	<table id="pkginfo">
+		<tr>
+			<th><?= __('Category') . ': ' ?></th>
+<?php
+if ($SID && ($uid == $row["MaintainerUID"] ||
+	($atype == "Developer" || $atype == "Trusted User"))):
+?>
+			<td>
+				<form method="post" action="<?= htmlspecialchars(get_pkg_uri($row['Name']), ENT_QUOTES); ?>">
+					<div>
+						<input type="hidden" name="action" value="do_ChangeCategory" />
+						<?php if ($SID): ?>
+						<input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
+						<?php endif; ?>
+						<select name="category_id">
+<?php
+	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>
+				</form>
+<?php else: ?>
+			<td>
+				<a href="<?= get_uri('/packages/'); ?>?C=<?= $row['CategoryID'] ?>"><?= $row['Category'] ?></a>
+<?php endif; ?>
+			</td>
+		</tr>
+		<tr>
+			<th><?= __('Submitter') .': ' ?></th>
+<?php
+if ($row["SubmitterUID"]):
+	if ($SID):
+		if (!$USE_VIRTUAL_URLS):
+?>
+			<td><a href="<?= get_uri('/account/'); ?>?Action=AccountInfo&ID=<?= htmlspecialchars($row['SubmitterUID'], ENT_QUOTES) ?>" title="<?= __('View account information for')?> <?= htmlspecialchars($submitter) ?>"><?= htmlspecialchars($submitter) ?></a></td>
+		<?php else: ?>
+			<td><a href="<?= get_uri('/account/') . htmlspecialchars($submitter, ENT_QUOTES) ?>" title="<?= __('View account information for %s', htmlspecialchars($submitter)) ?>"><?= htmlspecialchars($submitter) ?></a></td>
+		<?php endif; ?>
+<?php else: ?>
+		<td><?= htmlspecialchars($submitter) ?></td>
+	<?php endif; ?>
+<?php else: ?>
+			<td><?= __('None') ?></td>
+<?php endif; ?>
+		</tr>
+		<tr>
+			<th><?= __('Maintainer') .': ' ?></th>
+<?php
+if ($row["MaintainerUID"]):
+	if ($SID):
+		if (!$USE_VIRTUAL_URLS):
+?>
+			<td><a href="<?= get_uri('/account/'); ?>?Action=AccountInfo&ID=<?= htmlspecialchars($row['MaintainerUID'], ENT_QUOTES) ?>" title="<?= __('View account information for')?> <?= htmlspecialchars($maintainer) ?>"><?= htmlspecialchars($maintainer) ?></a></td>
+		<?php else: ?>
+			<td><a href="<?= get_uri('/account/') . htmlspecialchars($maintainer, ENT_QUOTES) ?>" title="<?= __('View account information for %s', htmlspecialchars($maintainer)) ?>"><?= htmlspecialchars($maintainer) ?></a></td>
+		<?php endif; ?>
+	<?php else: ?>
+		<td><?= htmlspecialchars($maintainer) ?></td>
+	<?php endif; ?>
+<?php else: ?>
+			<td><?= __('None') ?></td>
+<?php endif; ?>
+		</tr>
+		<tr>
+			<th><?= __('Votes') . ': ' ?></th>
+<?php if ($atype == "Developer" || $atype == "Trusted User"): ?>
+<?php if ($USE_VIRTUAL_URLS): ?>
+			<td><a href="<?= get_pkg_uri($row['Name']); ?>voters/"><?= $votes ?></a></td>
+<?php else: ?>
+			<td><a href="<?= get_uri('/voters/'); ?>?N=<?= htmlspecialchars($row['Name'], ENT_QUOTES) ?>"><?= $votes ?></a></td>
+<?php endif; ?>
+<?php else: ?>
+			<td><?= $votes ?></td>
+<?php endif; ?>
+		</tr>
+		<tr>
+			<th><?= __('First Submitted') . ': ' ?></th>
+			<td><?= $submitted_time ?></td>
+		</tr>
+		<tr>
+			<th><?= __('Last Updated') . ': ' ?></th>
+			<td><?= $updated_time ?></td>
+		</tr>
+	</table>
+
+	<div id="metadata">
+		<div id="pkgs" class="listing">
+			<h3><?= __('Packages') . " (" . count($pkgs) . ")"?></h3>
+<?php if (count($pkgs) > 0): ?>
+			<ul>
+<?php
+	while (list($k, $pkg) = each($pkgs)):
+?>
+	<li><a href="<?= htmlspecialchars(get_pkg_uri($pkg), ENT_QUOTES); ?>" title="<?= __('View packages details for').' '. htmlspecialchars($pkg) ?>"><?= htmlspecialchars($pkg) ?></a></li>
+	<?php endwhile; ?>
+			</ul>
+<?php endif; ?>
+		</div>
+	</div>
+</div>
-- 
1.9.1



More information about the aur-dev mailing list