From faa3933fbb54d0fc4a12145bd0aefa899db30dea Mon Sep 17 00:00:00 2001 From: "matthew.gregg" Date: Tue, 15 Jul 2008 23:20:45 -0400 Subject: [PATCH] Added notice deletion http://laconi.ca/PITS/00045 Removes selected notice and any replies that reference it. Attempts to de-queue anything pending. This patch does not archive notices. darcs-hash:20080716032045-982e4-a0b5d37ecfa84796f1681dda54110094ad1424c6.gz --- actions/deletenotice.php | 92 +++++++++++++++++++++++++++++++++++++++ actions/showstream.php | 10 +++++ lib/deleteaction.php | 61 ++++++++++++++++++++++++++ lib/stream.php | 12 +++++ lib/util.php | 22 ++++++++++ theme/default/display.css | 18 ++++++++ theme/stoica/display.css | 18 ++++++++ 7 files changed, 233 insertions(+) create mode 100644 actions/deletenotice.php create mode 100644 lib/deleteaction.php diff --git a/actions/deletenotice.php b/actions/deletenotice.php new file mode 100644 index 0000000000..06c1bf27ea --- /dev/null +++ b/actions/deletenotice.php @@ -0,0 +1,92 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/deleteaction.php'); + +class DeletenoticeAction extends DeleteAction { + function handle($args) { + parent::handle($args); + # XXX: Ajax! + + if ($_SERVER['REQUEST_METHOD'] == 'POST') { + $this->delete_notice(); + } else if ($_SERVER['REQUEST_METHOD'] == 'GET') { + $this->show_form(); + } + } + + function get_instructions() { + return _('You are about to permanently delete a notice. Once this is done, it cannot be undone.'); + } + + function get_title() { + return _('Delete notice'); + } + + function show_form($error=NULL) { + $user = common_current_user(); + + common_show_header($this->get_title(), array($this, 'show_header'), array($q, $error), + array($this, 'show_top')); + common_element_start('form', array('id' => 'notice_delete_form', + 'method' => 'post', + 'action' => common_local_url('deletenotice'))); + common_hidden('notice', $this->trimmed(notice)); + common_element_start('p'); + common_element('span', array('id' => 'confirmation_text'),_('Are you sure you want to delete this notice?')); + + common_element('input', array('id' => 'submit_no', + 'name' => 'submit', + 'type' => 'submit', + 'value' => _('No'))); + common_element('input', array('id' => 'submit_yes', + 'name' => 'submit', + 'type' => 'submit', + 'value' => _('Yes'))); + common_element_end('p'); + common_element_end('form'); + common_show_footer(); + } + + function delete_notice() { + $url = common_get_returnto(); + $confirmed = $this->trimmed('submit'); + if ($confirmed == 'Yes') { + $user = common_current_user(); + $notice_id = $this->trimmed('notice'); + $notice = Notice::staticGet($notice_id); + $replies = new Reply; + $replies->get('notice_id', $notice_id); + + common_dequeue_notice($notice); + $replies->delete(); + $notice->delete(); + } + else { + if ($url) { + common_set_returnto(NULL); + } else { + $url = common_local_url('public'); + } + } + common_redirect($url); + } +} diff --git a/actions/showstream.php b/actions/showstream.php index c05e30c392..59d4385c6d 100644 --- a/actions/showstream.php +++ b/actions/showstream.php @@ -363,6 +363,10 @@ class ShowstreamAction extends StreamAction { function show_notice($notice) { $profile = $notice->getProfile(); + if (common_logged_in()) { + $user = common_current_user(); + $user_profile = $user->getProfile(); + } # XXX: RDFa common_element_start('li', array('class' => 'notice_single', 'id' => 'notice-' . $notice->id)); @@ -400,6 +404,12 @@ class ShowstreamAction extends StreamAction { common_raw('→'); common_element_end('a'); common_element_end('p'); + if ($notice->profile_id == $user_profile->id) { + $deleteurl = common_local_url('deletenotice', array('notice' => $notice->id)); + common_element('a', array('class' => 'deletenotice', + 'href' => $deleteurl), + _('delete')); + } common_element_end('li'); } } \ No newline at end of file diff --git a/lib/deleteaction.php b/lib/deleteaction.php new file mode 100644 index 0000000000..5d7a3245ae --- /dev/null +++ b/lib/deleteaction.php @@ -0,0 +1,61 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +class DeleteAction extends Action { + + function handle($args) { + parent::handle($args); + $user = common_current_user(); + $notice_id = $this->trimmed('notice'); + $notice = Notice::staticGet($notice_id); + $profile = $notice->getProfile(); + $user_profile = $user->getProfile(); + + if (!common_logged_in()) { + common_user_error(_('Not logged in.')); + } else if ($notice->profile_id != $user_profile->id) { + common_user_error(_('Can\'t delete this notice.')); + } + } + + function show_top($arr=NULL) { + if ($arr) { + $error = $arr[1]; + } + if ($error) { + common_element('p', 'error', $error); + } else { + $instr = $this->get_instructions(); + $output = common_markup_to_html($instr); + common_element_start('div', 'instructions'); + common_raw($output); + common_element_end('div'); + } + } + + function get_title() { + return NULL; + } + + function show_header($arr) { + return; + } +} diff --git a/lib/stream.php b/lib/stream.php index fefd77a461..490a2739b3 100644 --- a/lib/stream.php +++ b/lib/stream.php @@ -27,6 +27,7 @@ class StreamAction extends Action { function handle($args) { parent::handle($args); + common_set_returnto($this->self_url()); } function views_menu() { @@ -62,6 +63,11 @@ class StreamAction extends Action { function show_notice($notice) { global $config; $profile = $notice->getProfile(); + if (common_logged_in()) { + $user = common_current_user(); + $user_profile = $user->getProfile(); + } + # XXX: RDFa common_element_start('li', array('class' => 'notice_single', 'id' => 'notice-' . $notice->id)); @@ -112,6 +118,12 @@ class StreamAction extends Action { common_raw('→'); common_element_end('a'); common_element_end('p'); + if ($notice->profile_id == $user_profile->id) { + $deleteurl = common_local_url('deletenotice', array('notice' => $notice->id)); + common_element('a', array('class' => 'deletenotice', + 'href' => $deleteurl), + _('delete')); + } common_element_end('li'); } } diff --git a/lib/util.php b/lib/util.php index a049ea600f..6d409f9436 100644 --- a/lib/util.php +++ b/lib/util.php @@ -751,6 +751,12 @@ function common_fancy_url($action, $args=NULL) { } case 'shownotice': return common_path('notice/'.$args['notice']); + case 'deletenotice': + if ($args && $args['notice']) { + return common_path('deletenotice/'.$args['notice']); + } else { + return common_path('deletenotice/'); + } case 'xrds': case 'foaf': return common_path($args['nickname'].'/'.$action); @@ -965,6 +971,22 @@ function common_enqueue_notice($notice) { return $result; } +function common_dequeue_notice($notice) { + $qi = Queue_Item::staticGet($notice->id); + if ($qi) { + $result = $qi->delete(); + if (!$result) { + $last_error = &PEAR::getStaticProperty('DB_DataObject','lastError'); + common_log(LOG_ERROR, 'DB error deleting queue item: ' . $last_error->message); + return false; + } + common_log(LOG_DEBUG, 'complete dequeueing notice ID = ' . $notice->id); + return $result; + } else { + return false; + } +} + function common_real_broadcast($notice, $remote=false) { $success = true; if (!$remote) { diff --git a/theme/default/display.css b/theme/default/display.css index 5ba7edc25e..efc94331d8 100644 --- a/theme/default/display.css +++ b/theme/default/display.css @@ -348,6 +348,24 @@ dl.statistics { margin: 0; padding: 0; } +#notice_delete_form #confirmation_text { + display: block; + font-size: 14px; + font-weight: bold; + } +input#submit_yes, input#submit_no { + margin: 18px 0; + padding: 8px; + font-weight: bold; + color: #fff6d5; + background-color: #F60; + cursor: pointer; + border: 0; + width: auto; + } +input#submit_yes:hover, input#submit_no:hover { + background-color: #701238; + } .avatar { float: left; margin: 0 10px 0 0; diff --git a/theme/stoica/display.css b/theme/stoica/display.css index d21c7cc246..60d4770699 100644 --- a/theme/stoica/display.css +++ b/theme/stoica/display.css @@ -235,6 +235,24 @@ p#branding a { margin: 0; padding: 0; } +#notice_delete_form #confirmation_text { + display: block; + font-size: 14px; + font-weight: bold; + } +input#submit_yes, input#submit_no { + margin: 18px 10px 0px 0px; + padding: 4px; + font-weight: bold; + color: #FCFFF5; + background-color: #C15D42; + cursor: pointer; + border: 0; + width: 40px; + } +input#submit_yes:hover, input#submit_no:hover { + background-color: #904632; + } .avatar.stream { float: left; margin: 0 10px 0 0;