<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[7607] sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt: WordCamp: Support Meetup Applications and review in central.</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { white-space: pre-line; overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="http://meta.trac.wordpress.org/changeset/7607">7607</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"http://meta.trac.wordpress.org/changeset/7607","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>vedjain</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2018-08-13 11:52:14 +0000 (Mon, 13 Aug 2018)</dd>
</dl>
<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>WordCamp: Support Meetup Applications and review in central.
Major refactor to WordCamp post types, to extract out code which is then used in Meetup post types and application. This code is **not** 5.x compatible.
Eventually, the aim is to credit contributors for their work organizing meetup groups in the WordPress chapter program, and make use of existing administrative tools to meetup applications/groups.
This is the (Non exhaustive) test plan after this commit is deployed:
- Existing WordCamp schedule
- WordCamp organizer application render.
- Submit WordCamp application. Fill all fields and make sure they exists in app.
- Verify original application.
- Verify protected fields.
- Verify REST API responses for wordcamp posts (#)
- Status mapping, and transition to valid next statuses.
- Move application from Needs Vetting to Needs Site. Add private notes.
- Track and verify application status page.
- Create a site for wordcamp
Test plan for Meetups
- Submit meetup applications. Fill all fields and make sure they are saved.
- Change application status. Add and remove meta box fields to make sure they are saved.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptviewsapplicationswordcampshortcodeapplicationphp">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/views/applications/wordcamp/shortcode-application.php</a></li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptviewswordcampmetaboxstatusphp">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/views/wordcamp/metabox-status.php</a></li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcptfunctionsphp">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-functions.php</a></li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcptloaderphp">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-loader.php</a></li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcptwordcampwordcampadminphp">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-wordcamp/wordcamp-admin.php</a></li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcptwordcampwordcamploaderphp">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-wordcamp/wordcamp-loader.php</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptcssapplicationsadmincss">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/css/applications/admin.css</a></li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptcssapplicationsmeetupcss">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/css/applications/meetup.css</a></li>
<li>sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/views/applications/meetup/</li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptviewsapplicationsmeetupshortcodeapplicationphp">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/views/applications/meetup/shortcode-application.php</a></li>
<li>sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-event/</li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcpteventclasseventadminphp">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-event/class-event-admin.php</a></li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcpteventclasseventapplicationphp">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-event/class-event-application.php</a></li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcpteventclasseventloaderphp">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-event/class-event-loader.php</a></li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcpteventtrackerphp">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-event/tracker.php</a></li>
<li>sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/</li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcptmeetupclassmeetupadminphp">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/class-meetup-admin.php</a></li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcptmeetupclassmeetupapplicationphp">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/class-meetup-application.php</a></li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcptmeetupmeetuploaderphp">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/meetup-loader.php</a></li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcptmeetupmeetupphp">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/meetup.php</a></li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcptwordcampclasswordcampapplicationphp">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-wordcamp/class-wordcamp-application.php</a></li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcptwordcampwordcampphp">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-wordcamp/wordcamp.php</a></li>
</ul>
<h3>Removed Paths</h3>
<ul>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptapplicationscommonphp">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/applications/common.php</a></li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptapplicationstrackerphp">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/applications/tracker.php</a></li>
<li>sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/views/applications/tracker/</li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptapplicationscommonphp"></a>
<div class="delfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Deleted: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/applications/common.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/applications/common.php 2018-08-13 07:28:19 UTC (rev 7606)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/applications/common.php 2018-08-13 11:52:14 UTC (rev 7607)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1,24 +0,0 @@
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-<?php
-
-namespace WordPress_Community\Applications;
-defined( 'WPINC' ) or die();
-
-add_action( 'wp_enqueue_scripts', __NAMESPACE__ . '\enqueue_assets', 11 );
-
-/**
- * Enqueue scripts and stylesheets
- */
-function enqueue_assets() {
- global $post;
-
- wp_register_style(
- 'wp-community-applications',
- plugins_url( 'css/applications/common.css', __DIR__ ),
- array(),
- 1
- );
-
- if ( isset( $post->post_content ) && has_shortcode( $post->post_content, WordCamp\SHORTCODE_SLUG ) ) {
- wp_enqueue_style( 'wp-community-applications' );
- }
-}
</del></span></pre></div>
<a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptapplicationstrackerphp"></a>
<div class="delfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Deleted: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/applications/tracker.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/applications/tracker.php 2018-08-13 07:28:19 UTC (rev 7606)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/applications/tracker.php 2018-08-13 11:52:14 UTC (rev 7607)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1,134 +0,0 @@
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-<?php
-
-namespace WordPress_Community\Applications\Tracker;
-use \WordCamp_Loader;
-defined( 'WPINC' ) or die();
-
-const SHORTCODE_SLUG = 'application-tracker';
-
-add_shortcode( SHORTCODE_SLUG, __NAMESPACE__ . '\render_status_shortcode' );
-add_action( 'wp_enqueue_scripts', __NAMESPACE__ . '\enqueue_scripts' );
-
-/**
- * Render the [application-tracker] shortcode.
- */
-function render_status_shortcode() {
- return '<div id="wpc-application-tracker">Loading Application Tracker...</div>';
-}
-
-/**
- * Get camps that are active enough to be shown on the tracker
- *
- * @return array
- */
-function get_active_wordcamps() {
- $wordcamps = array();
- $statuses = WordCamp_Loader::get_post_statuses();
- $milestones = WordCamp_Loader::map_statuses_to_milestones();
- $inactive_timestamp = strtotime( '60 days ago' );
-
- $shown_statuses = $statuses;
- unset( $shown_statuses[ WCPT_FINAL_STATUS ] );
- $shown_statuses = array_keys( $shown_statuses );
-
- $raw_posts = get_posts( array(
- 'post_type' => WCPT_POST_TYPE_ID,
- 'post_status' => $shown_statuses,
- 'posts_per_page' => 300,
- 'order' => 'ASC',
- 'orderby' => 'post_title',
- ) );
-
- foreach ( $raw_posts as $key => $post ) {
- $last_update_timestamp = get_last_update_timestamp( $post->ID );
-
- if ( $last_update_timestamp <= $inactive_timestamp ) {
- continue;
- }
-
- $wordcamps[] = array(
- 'city' => $post->post_title,
- 'cityUrl' => filter_var( get_post_meta( $post->ID, 'URL', true ), FILTER_VALIDATE_URL ),
- 'applicant' => get_post_meta( $post->ID, 'Organizer Name', true ),
- 'milestone' => $milestones[ $post->post_status ],
- 'status' => $statuses[ $post->post_status ],
- 'lastUpdate' => human_time_diff( time(), $last_update_timestamp ) . ' ago',
- );
- }
-
- return $wordcamps;
-}
-
-/**
- * Get the timestamp of the last time the post status changed
- *
- * @param int $post_id
- *
- * @return int
- */
-function get_last_update_timestamp( $post_id ) {
- $last_update_timestamp = 0;
- $status_changes = get_post_meta( $post_id, '_status_change' );
-
- if ( $status_changes ) {
- usort( $status_changes, 'wcpt_sort_log_entries' );
- $last_update_timestamp = $status_changes[0]['timestamp'];
- }
-
- return $last_update_timestamp;
-}
-
-/**
- * Enqueue scripts and styles
- */
-function enqueue_scripts() {
- global $post;
-
- wp_register_script(
- 'wpc-application-tracker',
- plugins_url( 'javascript/tracker/build/applications.min.js', dirname( __FILE__ ) ), // this file was renamed from 'tracker', which was getting flagged by ad blockers
- array(),
- 1,
- true
- );
-
- wp_register_style(
- 'wpc-application-tracker',
- plugins_url( 'javascript/tracker/build/applications.min.css', dirname( __FILE__ ) ), // this file was renamed from 'tracker', which was getting flagged by ad blockers
- array( 'dashicons', 'list-tables' ),
- 1
- );
-
- if ( ! is_a( $post, 'WP_POST' ) || ! has_shortcode( $post->post_content, SHORTCODE_SLUG ) ) {
- return;
- }
-
- wp_enqueue_script( 'wpc-application-tracker' );
-
- wp_localize_script(
- 'wpc-application-tracker',
- 'wpcApplicationTracker',
- array(
- 'applications' => get_active_wordcamps(),
- 'displayColumns' => get_display_columns(),
- 'initialSortField' => 'city',
- )
- );
-
- wp_enqueue_style( 'wpc-application-tracker' );
-}
-
-/**
- * Get the columns headers
- *
- * @return array
- */
-function get_display_columns() {
- return array(
- 'city' => 'City',
- 'applicant' => 'Applicant',
- 'milestone' => 'Milestone',
- 'status' => 'Status',
- 'lastUpdate' => 'Updated',
- );
-}
</del></span></pre></div>
<a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptcssapplicationsadmincss"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/css/applications/admin.css</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/css/applications/admin.css (rev 0)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/css/applications/admin.css 2018-08-13 11:52:14 UTC (rev 7607)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,3 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+span.swag-needed-icon {
+ color: goldenrod;
+}
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of file
</span><span class="cx" style="display: block; padding: 0 10px">Property changes on: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/css/applications/admin.css
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:eol-style</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+native
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptcssapplicationsmeetupcss"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/css/applications/meetup.css</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/css/applications/meetup.css (rev 0)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/css/applications/meetup.css 2018-08-13 11:52:14 UTC (rev 7607)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,26 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+#meetup-application label {
+ display: block;
+ margin-bottom: 1em;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+
+#meetup-application .required-indicator,
+#meetup-application .label-description {
+ font-size: .8em;
+ font-style: italic;
+ opacity: 0.7;
+}
+
+#meetup-application .label-description {
+ display: block;
+}
+
+#meetup-application input,
+#meetup-application select,
+#meetup-application textarea {
+ display: block;
+ width: 100%;
+ margin-top: .15em;
+}
+
</ins><span class="cx" style="display: block; padding: 0 10px">Property changes on: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/css/applications/meetup.css
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:eol-style</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+native
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptviewsapplicationsmeetupshortcodeapplicationphp"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/views/applications/meetup/shortcode-application.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/views/applications/meetup/shortcode-application.php (rev 0)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/views/applications/meetup/shortcode-application.php 2018-08-13 11:52:14 UTC (rev 7607)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,120 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+<?php
+
+namespace WordPress_Community\Applications\Meetup;
+defined( 'WPINC' ) or die();
+
+/**
+ * Renders the application form for meetup. Renders shortcode meetup-organizer-application
+ *
+ * @param array $countries
+ */
+function render_meetup_application_form( $countries ) {
+
+ ?>
+
+ <form id="meetup-application" method="post">
+ <label>
+ First Name
+ <span class="required-indicator">(required)</span>
+ <input type="text" name="q_first_name" required/>
+ </label>
+
+ <label>
+ Last Name
+ <span class="required-indicator">(required)</span>
+ <input type="text" name="q_last_name" required/>
+ </label>
+
+ <label>
+ Email Address
+ <span class="required-indicator">(required)</span>
+ <input type="email" name="q_email" required/>
+ </label>
+
+ <label>
+ City
+ <span class="required-indicator">(required)</span>
+ <input type="text" name="q_city" required/>
+ </label>
+
+ <label>
+ State/Province
+ <span class="required-indicator">(required)</span>
+ <input type="text" name="q_state" required/>
+ </label>
+
+ <label>
+ Country
+ <span class="required-indicator">(required)</span>
+
+ <select name="q_country" required>
+ <option value=""></option>
+
+ <?php foreach ( $countries as $country ) : ?>
+ <option value="<?php echo esc_attr( $country['alpha2'] ); ?>">
+ <?php echo esc_html( $country['name'] ); ?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ </label>
+
+ <label>
+ ZIP/Postal Code <span class="required-indicator">(required)</span>
+ <input type="text" name="q_zip" required/>
+ </label>
+
+ <label>
+ Is there already a WordPress meetup group in your city?
+ <span class="required-indicator">(required)</span>
+ <span class="label-description">If you don't know, please <a href="https://www.meetup.com/topics/wordpress/"
+ target="_blank" rel="noopener noreferrer">check Meetup.com</a> first.</span>
+
+ <select name="q_already_a_meetup" required>
+ <option value=""></option>
+ <option>Nope, no current meetup group</option>
+ <option>Yes, it's the meetup I run now</option>
+ <option>Yes, but I want to do a different kind of meetup</option>
+ </select>
+ </label>
+
+ <label>
+ <!-- todo: Show/hide this via JavaScript based on selected answer above -->
+ If there's an existing Meetup.com group, please provide the URL
+ <input type="url" name="q_existing_meetup_url"/>
+ </label>
+
+ <label>
+ How would you describe yourself?
+ <span class="required-indicator">(required)</span>
+
+ <select name="q_describe_yourself" required>
+ <option value=""></option>
+ <option>WordPress professional</option>
+ <option>Current WordPress user or developer</option>
+ <option>New to WordPress</option>
+ <option>I don't use WordPress</option>
+ </select>
+ </label>
+
+ <label>
+ Your <a href="https://wordpress.org" target="_blank">WordPress.org</a> username
+ <span class="required-indicator">(required)</span>
+ <input type="text" name="q_wporg_username" required/>
+ </label>
+
+ <label>
+ Your <a href="https://chat.wordpress.org" target="_blank">WordPress Slack</a> username
+ <input type="text" name="q_wp_slack_username"/>
+ </label>
+
+ <label>
+ Anything you'd like to tell us about yourself, or what you hope to do with a meetup group?
+ <textarea name="slack_username"></textarea>
+ </label>
+
+ <?php submit_button( 'Submit Application', 'primary', 'submit-application' ); ?>
+
+ </form>
+
+ <?php
+}
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of file
</span><span class="cx" style="display: block; padding: 0 10px">Property changes on: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/views/applications/meetup/shortcode-application.php
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:eol-style</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+native
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptviewsapplicationswordcampshortcodeapplicationphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/views/applications/wordcamp/shortcode-application.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/views/applications/wordcamp/shortcode-application.php 2018-08-13 07:28:19 UTC (rev 7606)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/views/applications/wordcamp/shortcode-application.php 2018-08-13 11:52:14 UTC (rev 7607)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3,1328 +3,1482 @@
</span><span class="cx" style="display: block; padding: 0 10px"> namespace WordPress_Community\Applications\WordCamp;
</span><span class="cx" style="display: block; padding: 0 10px"> defined( 'WPINC' ) or die();
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-// Modified from https://wordcampcentral.polldaddy.com/s/wordcamp-organizer-application
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-?>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+/**
+ * Renders the application form for meetup. Renders shortcode meetup-organizer-application
+ * Modified from https://wordcampcentral.polldaddy.com/s/wordcamp-organizer-application
+ *
+ * @param array $countries
+ */
+function render_wordcamp_application_form( $countries ) {
+ ?>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-<form id="wordcamp-application" method="post">
- <div class="PDF_pageOuter">
- <div class="PDF_pageInner">
- <div class="PDF_question" id="pd-question-10000">
- <div class="qContent">
- <div class="PDF_QT1900">
- <h2>Part I: About You</h2>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <form id="wordcamp-application" method="post">
+ <div class="PDF_pageOuter">
+ <div class="PDF_pageInner">
+ <div class="PDF_question" id="pd-question-10000">
+ <div class="qContent">
+ <div class="PDF_QT1900">
+ <h2>Part I: About You</h2>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-10000"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-10000"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-1">
- <div class="qNumber">
- Q.1
- </div>
-
- <div class="qContent">
- <div class="qText">
- Please enter your name.
- <span class="PDF_mand">*</span>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-1">
+ <div class="qNumber">
+ Q.1
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT800">
- <div>
- <label for="q_1079074_first_name">First Name</label>
- <br />
- <input type="text" class="firstName" maxlength="50" name="q_1079074_first_name" id="q_1079074_first_name" value="" required />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ Please enter your name.
+ <span class="PDF_mand">*</span>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div>
- <label for="q_1079074_last_name">Last Name</label>
- <br />
- <input type="text" class="lastName" maxlength="50" name="q_1079074_last_name" id="q_1079074_last_name" value="" required />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_QT800">
+ <div>
+ <label for="q_1079074_first_name">First Name</label>
+ <br/>
+ <input type="text" class="firstName" maxlength="50" name="q_1079074_first_name"
+ id="q_1079074_first_name" value="" required/>
+ </div>
+
+ <div>
+ <label for="q_1079074_last_name">Last Name</label>
+ <br/>
+ <input type="text" class="lastName" maxlength="50" name="q_1079074_last_name"
+ id="q_1079074_last_name" value="" required/>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-1"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-1"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-2">
- <div class="qNumber">
- Q.2
- </div>
-
- <div class="qContent">
- <div class="qText">
- Please enter your email address.
- <span class="PDF_mand">*</span>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-2">
+ <div class="qNumber">
+ Q.2
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT1400">
- <label for="q_1079059_email">(e.g. john@example.com)</label>
- <br />
- <input type="email" maxlength="100" name="q_1079059_email" id="q_1079059_email" value="" class="survey-email required" autocomplete="off" required />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ Please enter your email address.
+ <span class="PDF_mand">*</span>
+ </div>
+
+ <div class="PDF_QT1400">
+ <label for="q_1079059_email">(e.g. john@example.com)</label>
+ <br/>
+ <input type="email" maxlength="100" name="q_1079059_email" id="q_1079059_email" value=""
+ class="survey-email required" autocomplete="off" required/>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-2"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-2"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-31">
- <div class="qNumber">
- Q.31
- </div>
-
- <div class="qContent">
- <div class="qText">
- What is your wordpress.org username?
- <span class="PDF_mand">*</span>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-31">
+ <div class="qNumber">
+ Q.31
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="qNote">
- <p>(This is the username you'd use to log in to http://wordpress.org/support/)</p>
- </div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ What is your wordpress.org username?
+ <span class="PDF_mand">*</span>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT100">
- <input value="" maxlength="500" name="q_4236565_wporg_username" class="large required" type="text" title="What is your wordpress.org username?" required />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qNote">
+ <p>(This is the username you'd use to log in to http://wordpress.org/support/)</p>
+ </div>
+
+ <div class="PDF_QT100">
+ <input value="" maxlength="500" name="q_4236565_wporg_username" class="large required"
+ type="text" title="What is your wordpress.org username?" required/>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-31"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-31"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-34">
- <div class="qNumber">
- Q.34
- </div>
-
- <div class="qContent">
- <div class="qText">
- What is your username on <a href="https://chat.wordpress.org" target="_blank">WordPress' Slack workspace</a>?
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-34">
+ <div class="qNumber">
+ Q.34
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT100">
- <input value="" maxlength="500" name="q_4236565_slack_username" class="large" type="text" title="What is your Slack username?" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ What is your username on <a href="https://chat.wordpress.org" target="_blank">WordPress'
+ Slack workspace</a>?
+ </div>
+
+ <div class="PDF_QT100">
+ <input value="" maxlength="500" name="q_4236565_slack_username" class="large" type="text"
+ title="What is your Slack username?"/>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question">
- <div class="qContent">
- <div class="qText">
- Where can we find you online?
- </div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question">
+ <div class="qContent">
+ <div class="qText">
+ Where can we find you online?
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT100">
- <input value="" maxlength="500" name="where_find_online" class="large" type="text" title="Where can we find you online?" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_QT100">
+ <input value="" maxlength="500" name="where_find_online" class="large" type="text"
+ title="Where can we find you online?"/>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-34"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-34"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-3">
- <div class="qNumber">
- Q.3
- </div>
-
- <div class="qContent">
- <div class="qText">
- Please enter your mailing address (at least your city/state or city/country).
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-3">
+ <div class="qNumber">
+ Q.3
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT900">
- <div>
- <label for="q_1079060_add1">Address Line 1</label>
- <br />
- <input type="text" maxlength="100" class="a" name="q_1079060_add1" id="q_1079060_add1" value="" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ Please enter your mailing address (at least your city/state or city/country).
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div>
- <label for="q_1079060_add2">Address Line 2</label>
- <br />
- <input type="text" maxlength="100" class="b" name="q_1079060_add2" id="q_1079060_add2" value="" />
- </div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_QT900">
+ <div>
+ <label for="q_1079060_add1">Address Line 1</label>
+ <br/>
+ <input type="text" maxlength="100" class="a" name="q_1079060_add1" id="q_1079060_add1"
+ value=""/>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div>
- <label for="q_1079060_city">City</label>
- <br />
- <input type="text" maxlength="50" class="c" name="q_1079060_city" id="q_1079060_city" value="" />
- </div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div>
+ <label for="q_1079060_add2">Address Line 2</label>
+ <br/>
+ <input type="text" maxlength="100" class="b" name="q_1079060_add2" id="q_1079060_add2"
+ value=""/>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div>
- <label for="q_1079060_state">State</label>
- <br />
- <input type="text" maxlength="50" class="d" name="q_1079060_state" id="q_1079060_state" value="" />
- </div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div>
+ <label for="q_1079060_city">City</label>
+ <br/>
+ <input type="text" maxlength="50" class="c" name="q_1079060_city" id="q_1079060_city"
+ value=""/>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div>
- <label for="q_1079060_zip">Zip Code</label>
- <br />
- <input type="text" maxlength="20" class="e" name="q_1079060_zip" id="q_1079060_zip" value="" />
- </div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div>
+ <label for="q_1079060_state">State</label>
+ <br/>
+ <input type="text" maxlength="50" class="d" name="q_1079060_state" id="q_1079060_state"
+ value=""/>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div>
- <label for="q_1079060_country">Country</label>
- <br />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div>
+ <label for="q_1079060_zip">Zip Code</label>
+ <br/>
+ <input type="text" maxlength="20" class="e" name="q_1079060_zip" id="q_1079060_zip"
+ value=""/>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <select name="q_1079060_country" id="q_1079060_country">
- <option value=""></option>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div>
+ <label for="q_1079060_country">Country</label>
+ <br/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <?php foreach ( $countries as $country ) : ?>
- <option value="<?php echo esc_attr( $country['alpha2'] ); ?>">
- <?php echo esc_html( $country['name'] ); ?>
- </option>
- <?php endforeach; ?>
- </select>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <select name="q_1079060_country" id="q_1079060_country">
+ <option value=""></option>
+
+ <?php foreach ( $countries as $country ) : ?>
+ <option value="<?php echo esc_attr( $country['alpha2'] ); ?>">
+ <?php echo esc_html( $country['name'] ); ?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-3"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-3"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-4">
- <div class="qNumber">
- Q.4
- </div>
-
- <div class="qContent">
- <div class="qText">
- How long have you been using WordPress?
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-4">
+ <div class="qNumber">
+ Q.4
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT400">
- <ul>
- <li>
- <input type="radio" name="q_1045947_years_using_wp" value="7+ years" id="q_1045947_1865361" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ How long have you been using WordPress?
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045947_1865361" value="1865361">
- 7+ years </label>
- </li>
- <li>
- <input type="radio" name="q_1045947_years_using_wp" value="6 years" id="q_1045947_1865362" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_QT400">
+ <ul>
+ <li>
+ <input type="radio" name="q_1045947_years_using_wp" value="7+ years"
+ id="q_1045947_1865361"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045947_1865362" value="1865362">
- 6 years </label>
- </li>
- <li>
- <input type="radio" name="q_1045947_years_using_wp" value="5 years" id="q_1045947_1865363" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045947_1865361" value="1865361">
+ 7+ years </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045947_years_using_wp" value="6 years"
+ id="q_1045947_1865362"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045947_1865363" value="1865363">
- 5 years </label>
- </li>
- <li>
- <input type="radio" name="q_1045947_years_using_wp" value="4 years" id="q_1045947_1865369" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045947_1865362" value="1865362">
+ 6 years </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045947_years_using_wp" value="5 years"
+ id="q_1045947_1865363"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045947_1865369" value="1865369">
- 4 years </label>
- </li>
- <li>
- <input type="radio" name="q_1045947_years_using_wp" value="3 years" id="q_1045947_1865370" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045947_1865363" value="1865363">
+ 5 years </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045947_years_using_wp" value="4 years"
+ id="q_1045947_1865369"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045947_1865370" value="1865370">
- 3 years </label>
- </li>
- <li>
- <input type="radio" name="q_1045947_years_using_wp" value="2 years" id="q_1045947_1865371" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045947_1865369" value="1865369">
+ 4 years </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045947_years_using_wp" value="3 years"
+ id="q_1045947_1865370"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045947_1865371" value="1865371">
- 2 years </label>
- </li>
- <li>
- <input type="radio" name="q_1045947_years_using_wp" value="1 year" id="q_1045947_1865372" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045947_1865370" value="1865370">
+ 3 years </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045947_years_using_wp" value="2 years"
+ id="q_1045947_1865371"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045947_1865372" value="1865372">
- 1 year </label>
- </li>
- <li>
- <input type="radio" name="q_1045947_years_using_wp" value="less than a year" id="q_1045947_1865373" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045947_1865371" value="1865371">
+ 2 years </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045947_years_using_wp" value="1 year"
+ id="q_1045947_1865372"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045947_1865373" value="1865373">
- Less than a year </label>
- </li>
- <li>
- <input type="radio" name="q_1045947_years_using_wp" value="I don't use WordPress yet" id="q_1045947_1865374" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045947_1865372" value="1865372">
+ 1 year </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045947_years_using_wp" value="less than a year"
+ id="q_1045947_1865373"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045947_1865374" value="1865374">
- I don't use WordPress yet </label>
- </li>
- </ul>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045947_1865373" value="1865373">
+ Less than a year </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045947_years_using_wp"
+ value="I don't use WordPress yet" id="q_1045947_1865374"/>
+
+ <label for="q_1045947_1865374" value="1865374">
+ I don't use WordPress yet </label>
+ </li>
+ </ul>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-4"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-4"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-5">
- <div class="qNumber">
- Q.5
- </div>
-
- <div class="qContent">
- <div class="qText">
- How have you been involved in the WordPress community so far?
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-5">
+ <div class="qNumber">
+ Q.5
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT400">
- <ul>
- <li>
- <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908777" value="I use WordPress for my website(s)" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ How have you been involved in the WordPress community so far?
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068246_1908777">I use WordPress for my website(s)</label>
- </li>
- <li>
- <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908778" value="I help other people use WordPress for their websites" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_QT400">
+ <ul>
+ <li>
+ <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908777"
+ value="I use WordPress for my website(s)"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068246_1908778">I help other people use WordPress for their websites</label>
- </li>
- <li>
- <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908779" value="I make plugins" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068246_1908777">I use WordPress for my website(s)</label>
+ </li>
+ <li>
+ <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908778"
+ value="I help other people use WordPress for their websites"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068246_1908779">I make plugins</label>
- </li>
- <li>
- <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908831" value="I make themes" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068246_1908778">I help other people use WordPress for their
+ websites</label>
+ </li>
+ <li>
+ <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908779"
+ value="I make plugins"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068246_1908831">I make themes</label>
- </li>
- <li>
- <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908832" value="I contribute to the WordPress core codebase" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068246_1908779">I make plugins</label>
+ </li>
+ <li>
+ <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908831"
+ value="I make themes"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068246_1908832">I contribute to the WordPress core codebase</label>
- </li>
- <li>
- <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908833" value="I volunteer in the support forums at wordpress.org" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068246_1908831">I make themes</label>
+ </li>
+ <li>
+ <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908832"
+ value="I contribute to the WordPress core codebase"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068246_1908833">I volunteer in the support forums at wordpress.org</label>
- </li>
- <li>
- <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908834" value="I contribute to the WordPress core UI group" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068246_1908832">I contribute to the WordPress core codebase</label>
+ </li>
+ <li>
+ <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908833"
+ value="I volunteer in the support forums at wordpress.org"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068246_1908834">I contribute to the WordPress core UI group</label>
- </li>
- <li>
- <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908835" value="I'm involved with local WordPress meetups" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068246_1908833">I volunteer in the support forums at
+ wordpress.org</label>
+ </li>
+ <li>
+ <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908834"
+ value="I contribute to the WordPress core UI group"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068246_1908835">I'm involved with local WordPress meetups</label>
- </li>
- <li>
- <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908836" value="I've been involved with previous WordCamps" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068246_1908834">I contribute to the WordPress core UI group</label>
+ </li>
+ <li>
+ <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908835"
+ value="I'm involved with local WordPress meetups"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068246_1908836">I've been involved with previous WordCamps</label>
- </li>
- <li>
- <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1926765" value="WordPress helps me make a living" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068246_1908835">I'm involved with local WordPress meetups</label>
+ </li>
+ <li>
+ <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908836"
+ value="I've been involved with previous WordCamps"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068246_1926765">WordPress helps me make a living</label>
- </li>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068246_1908836">I've been involved with previous WordCamps</label>
+ </li>
+ <li>
+ <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1926765"
+ value="WordPress helps me make a living"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <li>
- <label for="q_1068246_other">Other:</label>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068246_1926765">WordPress helps me make a living</label>
+ </li>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <input type="text" class="other" name="q_1068246_ways_involved_other" id="q_1068246_other" value="" style="width: 75%" />
- </li>
- </ul>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <li>
+ <label for="q_1068246_other">Other:</label>
+
+ <input type="text" class="other" name="q_1068246_ways_involved_other"
+ id="q_1068246_other" value="" style="width: 75%"/>
+ </li>
+ </ul>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-5"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-5"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-6">
- <div class="qNumber">
- Q.6
- </div>
-
- <div class="qContent">
- <div class="qText">
- Have you ever attended a WordCamp before?
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-6">
+ <div class="qNumber">
+ Q.6
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT400">
- <ul>
- <li>
- <input type="radio" name="q_1046032_attended_camp_before" value="Yes, more than one" id="q_1046032_1865479" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ Have you ever attended a WordCamp before?
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1046032_1865479" value="1865479">
- Yes, more than one </label>
- </li>
- <li>
- <input type="radio" name="q_1046032_attended_camp_before" value="Yes, I've been to one" id="q_1046032_1865480" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_QT400">
+ <ul>
+ <li>
+ <input type="radio" name="q_1046032_attended_camp_before" value="Yes, more than one"
+ id="q_1046032_1865479"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1046032_1865480" value="1865480">
- Yes, I've been to one </label>
- </li>
- <li>
- <input type="radio" name="q_1046032_attended_camp_before" value="No, I haven't been to a WordCamp yet" id="q_1046032_1865481" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1046032_1865479" value="1865479">
+ Yes, more than one </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1046032_attended_camp_before"
+ value="Yes, I've been to one" id="q_1046032_1865480"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1046032_1865481" value="1865481">
- No, I haven't been to a WordCamp yet </label>
- </li>
- </ul>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1046032_1865480" value="1865480">
+ Yes, I've been to one </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1046032_attended_camp_before"
+ value="No, I haven't been to a WordCamp yet" id="q_1046032_1865481"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1046032_1865481" value="1865481">
+ No, I haven't been to a WordCamp yet </label>
+ </li>
+ </ul>
+
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-6"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-6"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-7">
- <div class="qNumber">
- Q.7
- </div>
-
- <div class="qContent">
- <div class="qText">
- What WordCamps have you been to? Please list one per line in this format: City, Year (ex. San Francisco, 2010)
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-7">
+ <div class="qNumber">
+ Q.7
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT200">
- <textarea name="q_1046033_camps_been_to" class="small" rows="10" cols="40" title="What WordCamps have you been to? Please list one pe…"></textarea>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ What WordCamps have you been to? Please list one per line in this format: City, Year (ex.
+ San Francisco, 2010)
+ </div>
+
+ <div class="PDF_QT200">
+ <textarea name="q_1046033_camps_been_to" class="small" rows="10" cols="40"
+ title="What WordCamps have you been to? Please list one pe…"></textarea>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-7"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-7"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-8">
- <div class="qNumber">
- Q.8
- </div>
-
- <div class="qContent">
- <div class="qText">
- What do you hope to accomplish by organizing a WordCamp?
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-8">
+ <div class="qNumber">
+ Q.8
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT400">
- <ul>
- <li>
- <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908730" value="Grow my local WordPress community" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ What do you hope to accomplish by organizing a WordCamp?
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068223_1908730">Grow my local WordPress community</label>
- </li>
- <li>
- <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908731" value="Introduce new people to WordPress/teach new users" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_QT400">
+ <ul>
+ <li>
+ <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908730"
+ value="Grow my local WordPress community"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068223_1908731">Introduce new people to WordPress/teach new users</label>
- </li>
- <li>
- <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908732" value="Find collaborators for WordPress projects" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068223_1908730">Grow my local WordPress community</label>
+ </li>
+ <li>
+ <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908731"
+ value="Introduce new people to WordPress/teach new users"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068223_1908732">Find collaborators for WordPress projects</label>
- </li>
- <li>
- <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908771" value="Raise my visibility in the community" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068223_1908731">Introduce new people to WordPress/teach new
+ users</label>
+ </li>
+ <li>
+ <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908732"
+ value="Find collaborators for WordPress projects"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068223_1908771">Raise my visibility in the community</label>
- </li>
- <li>
- <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908772" value="Make connections with visiting speakers (like Matt Mullenweg)" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068223_1908732">Find collaborators for WordPress projects</label>
+ </li>
+ <li>
+ <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908771"
+ value="Raise my visibility in the community"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068223_1908772">Make connections with visiting speakers (like Matt Mullenweg)</label>
- </li>
- <li>
- <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908773" value="Make money from surplus ticket sales/sponsorships" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068223_1908771">Raise my visibility in the community</label>
+ </li>
+ <li>
+ <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908772"
+ value="Make connections with visiting speakers (like Matt Mullenweg)"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068223_1908773">Make money from surplus ticket sales/sponsorships</label>
- </li>
- <li>
- <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908774" value="Have fun/throw a good party" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068223_1908772">Make connections with visiting speakers (like Matt
+ Mullenweg)</label>
+ </li>
+ <li>
+ <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908773"
+ value="Make money from surplus ticket sales/sponsorships"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068223_1908774">Have fun/throw a good party</label>
- </li>
- <li>
- <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908775" value="Be part of the zeitgeist, as WordCamps are very popular right now" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068223_1908773">Make money from surplus ticket
+ sales/sponsorships</label>
+ </li>
+ <li>
+ <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908774"
+ value="Have fun/throw a good party"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068223_1908775">Be part of the zeitgeist, as WordCamps are very popular right now</label>
- </li>
- <li>
- <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908776" value="Inspire people to do more with WordPress" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068223_1908774">Have fun/throw a good party</label>
+ </li>
+ <li>
+ <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908775"
+ value="Be part of the zeitgeist, as WordCamps are very popular right now"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068223_1908776">Inspire people to do more with WordPress</label>
- </li>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068223_1908775">Be part of the zeitgeist, as WordCamps are very
+ popular right now</label>
+ </li>
+ <li>
+ <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908776"
+ value="Inspire people to do more with WordPress"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <li>
- <label for="q_1068223_other">Other:</label>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068223_1908776">Inspire people to do more with WordPress</label>
+ </li>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <input type="text" class="other" name="q_1068223_hope_to_accomplish_other" id="q_1068223_other" value="" style="width: 75%" />
- </li>
- </ul>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <li>
+ <label for="q_1068223_other">Other:</label>
+
+ <input type="text" class="other" name="q_1068223_hope_to_accomplish_other"
+ id="q_1068223_other" value="" style="width: 75%"/>
+ </li>
+ </ul>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-8"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-8"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-10001">
- <div class="qContent">
- <div class="PDF_QT1900">
- <h2>Part II: About Your Local Community</h2>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-10001">
+ <div class="qContent">
+ <div class="PDF_QT1900">
+ <h2>Part II: About Your Local Community</h2>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-10001"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-10001"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-9">
- <div class="qNumber">
- Q.9
- </div>
-
- <div class="qContent">
- <div class="qText">
- Is there an active WordPress meetup in your area?
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-9">
+ <div class="qNumber">
+ Q.9
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT400">
- <ul>
- <li>
- <input type="radio" name="q_1045950_active_meetup" value="Yes" id="q_1045950_1865375" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ Is there an active WordPress meetup in your area?
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045950_1865375" value="1865375">
- Yes </label>
- </li>
- <li>
- <input type="radio" name="q_1045950_active_meetup" value="No" id="q_1045950_1865376" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_QT400">
+ <ul>
+ <li>
+ <input type="radio" name="q_1045950_active_meetup" value="Yes"
+ id="q_1045950_1865375"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045950_1865376" value="1865376">
- No </label>
- </li>
- <li>
- <input type="radio" name="q_1045950_active_meetup" value="I don't know" id="q_1045950_1865377" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045950_1865375" value="1865375">
+ Yes </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045950_active_meetup" value="No"
+ id="q_1045950_1865376"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045950_1865377" value="1865377">
- I don't know </label>
- </li>
- </ul>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045950_1865376" value="1865376">
+ No </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045950_active_meetup" value="I don't know"
+ id="q_1045950_1865377"/>
+
+ <label for="q_1045950_1865377" value="1865377">
+ I don't know </label>
+ </li>
+ </ul>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-9"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-9"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-10">
- <div class="qNumber">
- Q.10
- </div>
-
- <div class="qContent">
- <div class="qText">
- What is your role in the meetup group?
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-10">
+ <div class="qNumber">
+ Q.10
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT400">
- <ul>
- <li>
- <input type="radio" name="q_1045953_role_in_meetup" value="I am the organizer" id="q_1045953_1865378" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ What is your role in the meetup group?
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045953_1865378" value="1865378">
- I am the organizer </label>
- </li>
- <li>
- <input type="radio" name="q_1045953_role_in_meetup" value="I am a regular attendee and presenter" id="q_1045953_1865379" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_QT400">
+ <ul>
+ <li>
+ <input type="radio" name="q_1045953_role_in_meetup" value="I am the organizer"
+ id="q_1045953_1865378"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045953_1865379" value="1865379">
- I am a regular attendee and presenter </label>
- </li>
- <li>
- <input type="radio" name="q_1045953_role_in_meetup" value="I attend regularly but don't present" id="q_1045953_1865380" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045953_1865378" value="1865378">
+ I am the organizer </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045953_role_in_meetup"
+ value="I am a regular attendee and presenter" id="q_1045953_1865379"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045953_1865380" value="1865380">
- I attend regularly but don't present </label>
- </li>
- <li>
- <input type="radio" name="q_1045953_role_in_meetup" value="I attend sometimes" id="q_1045953_1865381" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045953_1865379" value="1865379">
+ I am a regular attendee and presenter </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045953_role_in_meetup"
+ value="I attend regularly but don't present" id="q_1045953_1865380"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045953_1865381" value="1865381">
- I attend sometimes </label>
- </li>
- <li>
- <input type="radio" name="q_1045953_role_in_meetup" value="I attend rarely" id="q_1045953_1865382" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045953_1865380" value="1865380">
+ I attend regularly but don't present </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045953_role_in_meetup" value="I attend sometimes"
+ id="q_1045953_1865381"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045953_1865382" value="1865382">
- I attend rarely </label>
- </li>
- <li>
- <input type="radio" name="q_1045953_role_in_meetup" value="I do not attend the meetups" id="q_1045953_1865383" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045953_1865381" value="1865381">
+ I attend sometimes </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045953_role_in_meetup" value="I attend rarely"
+ id="q_1045953_1865382"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045953_1865383" value="1865383">
- I do not attend the meetups </label>
- </li>
- </ul>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045953_1865382" value="1865382">
+ I attend rarely </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045953_role_in_meetup"
+ value="I do not attend the meetups" id="q_1045953_1865383"/>
+
+ <label for="q_1045953_1865383" value="1865383">
+ I do not attend the meetups </label>
+ </li>
+ </ul>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-10"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-10"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-11">
- <div class="qNumber">
- Q.11
- </div>
-
- <div class="qContent">
- <div class="qText">
- What is the URL for the meetup group's website?
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-11">
+ <div class="qNumber">
+ Q.11
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT100">
- <input value="" maxlength="500" name="q_1045972_meetup_url" class="large" type="url" title="What is the URL for the meetup group's website?" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ What is the URL for the meetup group's website?
+ </div>
+
+ <div class="PDF_QT100">
+ <input value="" maxlength="500" name="q_1045972_meetup_url" class="large" type="url"
+ title="What is the URL for the meetup group's website?"/>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-11"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-11"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-12">
- <div class="qNumber">
- Q.12
- </div>
-
- <div class="qContent">
- <div class="qText">
- About how many members are there?
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-12">
+ <div class="qNumber">
+ Q.12
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT400">
- <ul>
- <li>
- <input type="radio" name="q_1045967_meetup_members" value="500+" id="q_1045967_1865388" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ About how many members are there?
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045967_1865388" value="1865388">
- 500+ </label>
- </li>
- <li>
- <input type="radio" name="q_1045967_meetup_members" value="300-499" id="q_1045967_1865389" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_QT400">
+ <ul>
+ <li>
+ <input type="radio" name="q_1045967_meetup_members" value="500+"
+ id="q_1045967_1865388"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045967_1865389" value="1865389">
- 300-499 </label>
- </li>
- <li>
- <input type="radio" name="q_1045967_meetup_members" value="100-299" id="q_1045967_1865390" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045967_1865388" value="1865388">
+ 500+ </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045967_meetup_members" value="300-499"
+ id="q_1045967_1865389"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045967_1865390" value="1865390">
- 100-299 </label>
- </li>
- <li>
- <input type="radio" name="q_1045967_meetup_members" value="50-99" id="q_1045967_1865391" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045967_1865389" value="1865389">
+ 300-499 </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045967_meetup_members" value="100-299"
+ id="q_1045967_1865390"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045967_1865391" value="1865391">
- 50-99 </label>
- </li>
- <li>
- <input type="radio" name="q_1045967_meetup_members" value="26-49" id="q_1045967_1865392" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045967_1865390" value="1865390">
+ 100-299 </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045967_meetup_members" value="50-99"
+ id="q_1045967_1865391"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045967_1865392" value="1865392">
- 26-49 </label>
- </li>
- <li>
- <input type="radio" name="q_1045967_meetup_members" value="1-25" id="q_1045967_1865393" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045967_1865391" value="1865391">
+ 50-99 </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045967_meetup_members" value="26-49"
+ id="q_1045967_1865392"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045967_1865393" value="1865393">
- 1-25 </label>
- </li>
- <li>
- <input type="radio" name="q_1045967_meetup_members" value="I don't know" id="q_1045967_1926755" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045967_1865392" value="1865392">
+ 26-49 </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045967_meetup_members" value="1-25"
+ id="q_1045967_1865393"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045967_1926755" value="1926755">
- I don't know </label>
- </li>
- </ul>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045967_1865393" value="1865393">
+ 1-25 </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045967_meetup_members" value="I don't know"
+ id="q_1045967_1926755"/>
+
+ <label for="q_1045967_1926755" value="1926755">
+ I don't know </label>
+ </li>
+ </ul>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-12"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-12"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-13">
- <div class="qNumber">
- Q.13
- </div>
-
- <div class="qContent">
- <div class="qText">
- How often does the group have meetups?
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-13">
+ <div class="qNumber">
+ Q.13
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT400">
- <ul>
- <li>
- <input type="radio" name="q_1045956_how_often_meetup" value="Once per month" id="q_1045956_1865384" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ How often does the group have meetups?
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045956_1865384" value="1865384">
- Once per month </label>
- </li>
- <li>
- <input type="radio" name="q_1045956_how_often_meetup" value="Several per month" id="q_1045956_1865385" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_QT400">
+ <ul>
+ <li>
+ <input type="radio" name="q_1045956_how_often_meetup" value="Once per month"
+ id="q_1045956_1865384"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045956_1865385" value="1865385">
- Several per month </label>
- </li>
- <li>
- <input type="radio" name="q_1045956_how_often_meetup" value="One every couple of months" id="q_1045956_1865386" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045956_1865384" value="1865384">
+ Once per month </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045956_how_often_meetup" value="Several per month"
+ id="q_1045956_1865385"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045956_1865386" value="1865386">
- One every couple of months </label>
- </li>
- <li>
- <input type="radio" name="q_1045956_how_often_meetup" value="There's a group but it never meets" id="q_1045956_1865387" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045956_1865385" value="1865385">
+ Several per month </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045956_how_often_meetup"
+ value="One every couple of months" id="q_1045956_1865386"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045956_1865387" value="1865387">
- There's a group but it never meets </label>
- </li>
- </ul>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045956_1865386" value="1865386">
+ One every couple of months </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045956_how_often_meetup"
+ value="There's a group but it never meets" id="q_1045956_1865387"/>
+
+ <label for="q_1045956_1865387" value="1865387">
+ There's a group but it never meets </label>
+ </li>
+ </ul>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-13"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-13"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-14">
- <div class="qNumber">
- Q.14
- </div>
-
- <div class="qContent">
- <div class="qText">
- About how many people usually attend the meetups?
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-14">
+ <div class="qNumber">
+ Q.14
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT400">
- <ul>
- <li>
- <input type="radio" name="q_1045971_how_many_attend" value="500+" id="q_1045971_1865397" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ About how many people usually attend the meetups?
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045971_1865397" value="1865397">
- 500+ </label>
- </li>
- <li>
- <input type="radio" name="q_1045971_how_many_attend" value="300-499" id="q_1045971_1865398" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_QT400">
+ <ul>
+ <li>
+ <input type="radio" name="q_1045971_how_many_attend" value="500+"
+ id="q_1045971_1865397"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045971_1865398" value="1865398">
- 300-499 </label>
- </li>
- <li>
- <input type="radio" name="q_1045971_how_many_attend" value="100-299" id="q_1045971_1865399" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045971_1865397" value="1865397">
+ 500+ </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045971_how_many_attend" value="300-499"
+ id="q_1045971_1865398"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045971_1865399" value="1865399">
- 100-299 </label>
- </li>
- <li>
- <input type="radio" name="q_1045971_how_many_attend" value="50-99" id="q_1045971_1865400" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045971_1865398" value="1865398">
+ 300-499 </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045971_how_many_attend" value="100-299"
+ id="q_1045971_1865399"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045971_1865400" value="1865400">
- 50-99 </label>
- </li>
- <li>
- <input type="radio" name="q_1045971_how_many_attend" value="26-49" id="q_1045971_1865401" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045971_1865399" value="1865399">
+ 100-299 </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045971_how_many_attend" value="50-99"
+ id="q_1045971_1865400"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045971_1865401" value="1865401">
- 26-49 </label>
- </li>
- <li>
- <input type="radio" name="q_1045971_how_many_attend" value="1-25" id="q_1045971_1865402" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045971_1865400" value="1865400">
+ 50-99 </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045971_how_many_attend" value="26-49"
+ id="q_1045971_1865401"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1045971_1865402" value="1865402">
- 1-25 </label>
- </li>
- </ul>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1045971_1865401" value="1865401">
+ 26-49 </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1045971_how_many_attend" value="1-25"
+ id="q_1045971_1865402"/>
+
+ <label for="q_1045971_1865402" value="1865402">
+ 1-25 </label>
+ </li>
+ </ul>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-14"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-14"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-15">
- <div class="qNumber">
- Q.15
- </div>
-
- <div class="qContent">
- <div class="qText">
- Have other community tech events (BarCamp, meetups, open source conferences) been successful in your city?
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-15">
+ <div class="qNumber">
+ Q.15
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT400">
- <ul>
- <li>
- <input type="radio" name="q_1079086_other_tech_events" value="Yes, and I've attended some of them" id="q_1079086_1926723" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ Have other community tech events (BarCamp, meetups, open source conferences) been successful
+ in your city?
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1079086_1926723" value="1926723">
- Yes, and I've attended some of them </label>
- </li>
- <li>
- <input type="radio" name="q_1079086_other_tech_events" value="Yes, though I haven't attended any" id="q_1079086_1926724" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_QT400">
+ <ul>
+ <li>
+ <input type="radio" name="q_1079086_other_tech_events"
+ value="Yes, and I've attended some of them" id="q_1079086_1926723"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1079086_1926724" value="1926724">
- Yes, though I haven't attended any </label>
- </li>
- <li>
- <input type="radio" name="q_1079086_other_tech_events" value="No, we've had a few but they weren't very well-attended" id="q_1079086_1926725" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1079086_1926723" value="1926723">
+ Yes, and I've attended some of them </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1079086_other_tech_events"
+ value="Yes, though I haven't attended any" id="q_1079086_1926724"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1079086_1926725" value="1926725">
- No, we've had a few but they weren't very well-attended </label>
- </li>
- <li>
- <input type="radio" name="q_1079086_other_tech_events" value="We haven't had any community tech events yet" id="q_1079086_1926744" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1079086_1926724" value="1926724">
+ Yes, though I haven't attended any </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1079086_other_tech_events"
+ value="No, we've had a few but they weren't very well-attended"
+ id="q_1079086_1926725"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1079086_1926744" value="1926744">
- We haven't had any community tech events yet </label>
- </li>
- <li>
- <input type="radio" name="q_1079086_other_tech_events" value="I am not sure what events have been held here before, or if they've been successful" id="q_1079086_1926745" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1079086_1926725" value="1926725">
+ No, we've had a few but they weren't very well-attended </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1079086_other_tech_events"
+ value="We haven't had any community tech events yet" id="q_1079086_1926744"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1079086_1926745" value="1926745">
- I am not sure what events have been held here before, or if they've been successful </label>
- </li>
- </ul>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1079086_1926744" value="1926744">
+ We haven't had any community tech events yet </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1079086_other_tech_events"
+ value="I am not sure what events have been held here before, or if they've been successful"
+ id="q_1079086_1926745"/>
+
+ <label for="q_1079086_1926745" value="1926745">
+ I am not sure what events have been held here before, or if they've been
+ successful </label>
+ </li>
+ </ul>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-15"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-15"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-16">
- <div class="qNumber">
- Q.16
- </div>
-
- <div class="qContent">
- <div class="qText">
- List any community tech events that have/have not been successful in your city.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-16">
+ <div class="qNumber">
+ Q.16
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT200">
- <textarea name="q_1079082_other_tech_events_success" class="small" rows="10" cols="40" title="List any community tech events that have/have not b…"></textarea>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ List any community tech events that have/have not been successful in your city.
+ </div>
+
+ <div class="PDF_QT200">
+ <textarea name="q_1079082_other_tech_events_success" class="small" rows="10" cols="40"
+ title="List any community tech events that have/have not b…"></textarea>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-16"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-16"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-10002">
- <div class="qContent">
- <div class="PDF_QT1900">
- <h2>Part III: About Your Potential WordCamp</h2>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-10002">
+ <div class="qContent">
+ <div class="PDF_QT1900">
+ <h2>Part III: About Your Potential WordCamp</h2>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-10002"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-10002"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-17">
- <div class="qNumber">
- Q.17
- </div>
-
- <div class="qContent">
- <div class="qText">
- Enter the city, state/province, and country where you would like to organize a WordCamp.
- <span class="PDF_mand">*</span>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-17">
+ <div class="qNumber">
+ Q.17
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT100">
- <input value="" maxlength="500" name="q_1079103_wordcamp_location" class="large required" type="text" title="Enter the city, state/province, and country where y…" required />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ Enter the city, state/province, and country where you would like to organize a WordCamp.
+ <span class="PDF_mand">*</span>
+ </div>
+
+ <div class="PDF_QT100">
+ <input value="" maxlength="500" name="q_1079103_wordcamp_location" class="large required"
+ type="text" title="Enter the city, state/province, and country where y…"
+ required/>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-17"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-17"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-18">
- <div class="qNumber">
- Q.18
- </div>
-
- <div class="qContent">
- <div class="qText">
- When do you want to have a WordCamp in your city? (month/year)
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-18">
+ <div class="qNumber">
+ Q.18
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT100">
- <input value="" maxlength="500" name="q_1046006_wordcamp_date" class="large" type="text" title="When do you want to have a WordCamp in your city? (…" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ When do you want to have a WordCamp in your city? (month/year)
+ </div>
+
+ <div class="PDF_QT100">
+ <input value="" maxlength="500" name="q_1046006_wordcamp_date" class="large" type="text"
+ title="When do you want to have a WordCamp in your city? (…"/>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-18"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-18"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-19">
- <div class="qNumber">
- Q.19
- </div>
-
- <div class="qContent">
- <div class="qText">
- How many people do you think would attend?
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-19">
+ <div class="qNumber">
+ Q.19
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT100">
- <input value="" maxlength="500" name="q_1046007_how_many_attendees" class="large" type="text" title="How many people do you think would attend?" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ How many people do you think would attend?
+ </div>
+
+ <div class="PDF_QT100">
+ <input value="" maxlength="500" name="q_1046007_how_many_attendees" class="large"
+ type="text" title="How many people do you think would attend?"/>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-19"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-19"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-20">
- <div class="qNumber">
- Q.20
- </div>
-
- <div class="qContent">
- <div class="qText">
- Have you ever organized an event like this before?
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-20">
+ <div class="qNumber">
+ Q.20
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT400">
- <ul>
- <li>
- <input type="radio" name="q_1046038_organized_event_before" value="Yes, I've planned events of similar size/scope" id="q_1046038_1865485" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ Have you ever organized an event like this before?
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1046038_1865485" value="1865485">
- Yes, I've planned events of similar size/scope </label>
- </li>
- <li>
- <input type="radio" name="q_1046038_organized_event_before" value="I've organized similar types of events, but smaller" id="q_1046038_1865486" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_QT400">
+ <ul>
+ <li>
+ <input type="radio" name="q_1046038_organized_event_before"
+ value="Yes, I've planned events of similar size/scope"
+ id="q_1046038_1865485"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1046038_1865486" value="1865486">
- I've organized similar types of events, but smaller </label>
- </li>
- <li>
- <input type="radio" name="q_1046038_organized_event_before" value="I've organized other events" id="q_1046038_1865487" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1046038_1865485" value="1865485">
+ Yes, I've planned events of similar size/scope </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1046038_organized_event_before"
+ value="I've organized similar types of events, but smaller"
+ id="q_1046038_1865486"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1046038_1865487" value="1865487">
- I've organized other events </label>
- </li>
- <li>
- <input type="radio" name="q_1046038_organized_event_before" value="I've never organized an event before" id="q_1046038_1865495" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1046038_1865486" value="1865486">
+ I've organized similar types of events, but smaller </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1046038_organized_event_before"
+ value="I've organized other events" id="q_1046038_1865487"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1046038_1865495" value="1865495">
- I've never organized an event before </label>
- </li>
- </ul>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1046038_1865487" value="1865487">
+ I've organized other events </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1046038_organized_event_before"
+ value="I've never organized an event before" id="q_1046038_1865495"/>
+
+ <label for="q_1046038_1865495" value="1865495">
+ I've never organized an event before </label>
+ </li>
+ </ul>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-20"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-20"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-21">
- <div class="qNumber">
- Q.21
- </div>
-
- <div class="qContent">
- <div class="qText">
- Please give a brief description of the events you've been involved in organizing and what your role was.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-21">
+ <div class="qNumber">
+ Q.21
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT200">
- <textarea name="q_1046099_describe_events" class="small" rows="10" cols="40" title="Please give a brief description of the events you'v…"></textarea>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ Please give a brief description of the events you've been involved in organizing and
+ what your role was.
+ </div>
+
+ <div class="PDF_QT200">
+ <textarea name="q_1046099_describe_events" class="small" rows="10" cols="40"
+ title="Please give a brief description of the events you'v…"></textarea>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-21"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-21"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-22">
- <div class="qNumber">
- Q.22
- </div>
-
- <div class="qContent">
- <div class="qText">
- Do you have at least 2 co-organizers?
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-22">
+ <div class="qNumber">
+ Q.22
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT400">
- <ul>
- <li>
- <input type="radio" name="q_1046101_have_co_organizers" value="Yes, I have co-organizers already" id="q_1046101_1908677" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ Do you have at least 2 co-organizers?
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1046101_1908677" value="1908677">
- Yes, I have co-organizers already </label>
- </li>
- <li>
- <input type="radio" name="q_1046101_have_co_organizers" value="Nope, but I know some people who might be interested" id="q_1046101_1865560" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_QT400">
+ <ul>
+ <li>
+ <input type="radio" name="q_1046101_have_co_organizers"
+ value="Yes, I have co-organizers already" id="q_1046101_1908677"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1046101_1865560" value="1865560">
- Nope, but I know some people who might be interested </label>
- </li>
- <li>
- <input type="radio" name="q_1046101_have_co_organizers" value="Nope, I probably need help to find co-organizers" id="q_1046101_1865561" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1046101_1908677" value="1908677">
+ Yes, I have co-organizers already </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1046101_have_co_organizers"
+ value="Nope, but I know some people who might be interested"
+ id="q_1046101_1865560"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1046101_1865561" value="1865561">
- Nope, I probably need help to find co-organizers </label>
- </li>
- <li>
- <input type="radio" name="q_1046101_have_co_organizers" value="Nope, I want to do it by myself" id="q_1046101_1865562" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1046101_1865560" value="1865560">
+ Nope, but I know some people who might be interested </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1046101_have_co_organizers"
+ value="Nope, I probably need help to find co-organizers"
+ id="q_1046101_1865561"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1046101_1865562" value="1865562">
- Nope, I want to do it by myself </label>
- </li>
- </ul>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1046101_1865561" value="1865561">
+ Nope, I probably need help to find co-organizers </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1046101_have_co_organizers"
+ value="Nope, I want to do it by myself" id="q_1046101_1865562"/>
+
+ <label for="q_1046101_1865562" value="1865562">
+ Nope, I want to do it by myself </label>
+ </li>
+ </ul>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-22"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-22"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-23">
- <div class="qNumber">
- Q.23
- </div>
-
- <div class="qContent">
- <div class="qText">
- What's your relationship to your co-organizers?
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-23">
+ <div class="qNumber">
+ Q.23
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT400">
- <ul>
- <li>
- <input type="checkbox" name="q_1068188_relationship_co_organizers[]" id="q_1068188_1908678" value="We work for the same company" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ What's your relationship to your co-organizers?
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068188_1908678">We work for the same company</label>
- </li>
- <li>
- <input type="checkbox" name="q_1068188_relationship_co_organizers[]" id="q_1068188_1908679" value="We're friends" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_QT400">
+ <ul>
+ <li>
+ <input type="checkbox" name="q_1068188_relationship_co_organizers[]"
+ id="q_1068188_1908678" value="We work for the same company"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068188_1908679">We're friends</label>
- </li>
- <li>
- <input type="checkbox" name="q_1068188_relationship_co_organizers[]" id="q_1068188_1908680" value="We've collaborated on projects before" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068188_1908678">We work for the same company</label>
+ </li>
+ <li>
+ <input type="checkbox" name="q_1068188_relationship_co_organizers[]"
+ id="q_1068188_1908679" value="We're friends"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068188_1908680">We've collaborated on projects before</label>
- </li>
- <li>
- <input type="checkbox" name="q_1068188_relationship_co_organizers[]" id="q_1068188_1908689" value="We met through the meetup group/other tech event" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068188_1908679">We're friends</label>
+ </li>
+ <li>
+ <input type="checkbox" name="q_1068188_relationship_co_organizers[]"
+ id="q_1068188_1908680" value="We've collaborated on projects before"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068188_1908689">We met through the meetup group/other tech event</label>
- </li>
- <li>
- <label for="q_1068188_other">Other:</label>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068188_1908680">We've collaborated on projects before</label>
+ </li>
+ <li>
+ <input type="checkbox" name="q_1068188_relationship_co_organizers[]"
+ id="q_1068188_1908689"
+ value="We met through the meetup group/other tech event"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <input type="text" class="other" name="q_1068188_relationship_co_organizers_other" id="q_1068188_other" value="" style="width: 75%" />
- </li>
- </ul>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068188_1908689">We met through the meetup group/other tech
+ event</label>
+ </li>
+ <li>
+ <label for="q_1068188_other">Other:</label>
+
+ <input type="text" class="other" name="q_1068188_relationship_co_organizers_other"
+ id="q_1068188_other" value="" style="width: 75%"/>
+ </li>
+ </ul>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-23"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-23"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-24">
- <div class="qNumber">
- Q.24
- </div>
-
- <div class="qContent">
- <div class="qText">
- Please enter the names and email addresses of your co-organizers here.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-24">
+ <div class="qNumber">
+ Q.24
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT200">
- <textarea name="q_1068187_co_organizer_contact_info" class="small" rows="10" cols="40" title="Please enter the names and email addresses of your …"></textarea>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ Please enter the names and email addresses of your co-organizers here.
+ </div>
+
+ <div class="PDF_QT200">
+ <textarea name="q_1068187_co_organizer_contact_info" class="small" rows="10" cols="40"
+ title="Please enter the names and email addresses of your …"></textarea>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-24"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-24"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-25">
- <div class="qNumber">
- Q.25
- </div>
-
- <div class="qContent">
- <div class="qText">
- Are you confident you can raise money from local sponsors to cover the event costs?
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-25">
+ <div class="qNumber">
+ Q.25
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT400">
- <ul>
- <li>
- <input type="radio" name="q_1068214_raise_money" value="Yes, I'm cool with the fundraising" id="q_1068214_1908711" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ Are you confident you can raise money from local sponsors to cover the event costs?
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068214_1908711" value="1908711">
- Yes, I'm cool with the fundraising </label>
- </li>
- <li>
- <input type="radio" name="q_1068214_raise_money" value="I'm not sure -- I haven't done this before but I'll do my best" id="q_1068214_1908712" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_QT400">
+ <ul>
+ <li>
+ <input type="radio" name="q_1068214_raise_money"
+ value="Yes, I'm cool with the fundraising" id="q_1068214_1908711"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068214_1908712" value="1908712">
- I'm not sure -- I haven't done this before but I'll do my best </label>
- </li>
- <li>
- <input type="radio" name="q_1068214_raise_money" value="Not really, I hate asking people for money" id="q_1068214_1908713" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068214_1908711" value="1908711">
+ Yes, I'm cool with the fundraising </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1068214_raise_money"
+ value="I'm not sure -- I haven't done this before but I'll do my best"
+ id="q_1068214_1908712"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068214_1908713" value="1908713">
- Not really, I hate asking people for money </label>
- </li>
- </ul>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068214_1908712" value="1908712">
+ I'm not sure -- I haven't done this before but I'll do my best </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1068214_raise_money"
+ value="Not really, I hate asking people for money" id="q_1068214_1908713"/>
+
+ <label for="q_1068214_1908713" value="1908713">
+ Not really, I hate asking people for money </label>
+ </li>
+ </ul>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-25"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-25"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-26">
- <div class="qNumber">
- Q.26
- </div>
-
- <div class="qContent">
- <div class="qText">
- If there are businesses already interested in sponsoring, list them here.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-26">
+ <div class="qNumber">
+ Q.26
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT100">
- <input value="" maxlength="500" name="q_1068220_interested_sponsors" class="large" type="text" title="If there are businesses already interested in spons…" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ If there are businesses already interested in sponsoring, list them here.
+ </div>
+
+ <div class="PDF_QT100">
+ <input value="" maxlength="500" name="q_1068220_interested_sponsors" class="large"
+ type="text" title="If there are businesses already interested in spons…"/>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-26"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-26"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-27">
- <div class="qNumber">
- Q.27
- </div>
-
- <div class="qContent">
- <div class="qText">
- Do you know local people who would make good presenters/speakers?
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-27">
+ <div class="qNumber">
+ Q.27
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT400">
- <ul>
- <li>
- <input type="radio" name="q_1046009_good_presenters" value="Yes, I know lots of local WordPress users/developers" id="q_1046009_1865453" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ Do you know local people who would make good presenters/speakers?
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1046009_1865453" value="1865453">
- Yes, I know lots of local WordPress users/developers </label>
- </li>
- <li>
- <input type="radio" name="q_1046009_good_presenters" value="Yes, I know a couple of people who would be qualified" id="q_1046009_1865454" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_QT400">
+ <ul>
+ <li>
+ <input type="radio" name="q_1046009_good_presenters"
+ value="Yes, I know lots of local WordPress users/developers"
+ id="q_1046009_1865453"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1046009_1865454" value="1865454">
- Yes, I know a couple of people who would be qualified </label>
- </li>
- <li>
- <input type="radio" name="q_1046009_good_presenters" value="No, I don't know anyone local who could speak" id="q_1046009_1865455" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1046009_1865453" value="1865453">
+ Yes, I know lots of local WordPress users/developers </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1046009_good_presenters"
+ value="Yes, I know a couple of people who would be qualified"
+ id="q_1046009_1865454"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1046009_1865455" value="1865455">
- No, I don't know anyone local who could speak </label>
- </li>
- </ul>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1046009_1865454" value="1865454">
+ Yes, I know a couple of people who would be qualified </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1046009_good_presenters"
+ value="No, I don't know anyone local who could speak"
+ id="q_1046009_1865455"/>
+
+ <label for="q_1046009_1865455" value="1865455">
+ No, I don't know anyone local who could speak </label>
+ </li>
+ </ul>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-27"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-27"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-28">
- <div class="qNumber">
- Q.28
- </div>
-
- <div class="qContent">
- <div class="qText">
- Please enter the names of the people you have in mind, and describe them in a few words.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-28">
+ <div class="qNumber">
+ Q.28
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT200">
- <textarea name="q_1046021_presenter_names" class="small" rows="10" cols="40" title="Please enter the names of the people you have in mi…"></textarea>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ Please enter the names of the people you have in mind, and describe them in a few words.
+ </div>
+
+ <div class="PDF_QT200">
+ <textarea name="q_1046021_presenter_names" class="small" rows="10" cols="40"
+ title="Please enter the names of the people you have in mi…"></textarea>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-28"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-28"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-29">
- <div class="qNumber">
- Q.29
- </div>
-
- <div class="qContent">
- <div class="qText">
- Do you have any connections to potential venue donations (colleges, offices, etc)?
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-29">
+ <div class="qNumber">
+ Q.29
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT400">
- <ul>
- <li>
- <input type="radio" name="q_1068197_venue_connections" value="Yes, I've been talking to people already" id="q_1068197_1908695" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ Do you have any connections to potential venue donations (colleges, offices, etc)?
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068197_1908695" value="1908695">
- Yes, I've been talking to people already </label>
- </li>
- <li>
- <input type="radio" name="q_1068197_venue_connections" value="No, but I have some leads" id="q_1068197_1908696" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_QT400">
+ <ul>
+ <li>
+ <input type="radio" name="q_1068197_venue_connections"
+ value="Yes, I've been talking to people already" id="q_1068197_1908695"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068197_1908696" value="1908696">
- No, but I have some leads </label>
- </li>
- <li>
- <input type="radio" name="q_1068197_venue_connections" value="No, I'll be looking for a venue from scratch" id="q_1068197_1908697" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068197_1908695" value="1908695">
+ Yes, I've been talking to people already </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1068197_venue_connections"
+ value="No, but I have some leads" id="q_1068197_1908696"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1068197_1908697" value="1908697">
- No, I'll be looking for a venue from scratch </label>
- </li>
- </ul>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1068197_1908696" value="1908696">
+ No, but I have some leads </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1068197_venue_connections"
+ value="No, I'll be looking for a venue from scratch" id="q_1068197_1908697"/>
+
+ <label for="q_1068197_1908697" value="1908697">
+ No, I'll be looking for a venue from scratch </label>
+ </li>
+ </ul>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-29"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-29"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-30">
- <div class="qNumber">
- Q.30
- </div>
-
- <div class="qContent">
- <div class="qText">
- What possible venues are you considering?
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-30">
+ <div class="qNumber">
+ Q.30
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT200">
- <textarea name="q_1068212_venues_considering" class="small" rows="10" cols="40" title="What possible venues are you considering?"></textarea>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ What possible venues are you considering?
+ </div>
+
+ <div class="PDF_QT200">
+ <textarea name="q_1068212_venues_considering" class="small" rows="10" cols="40"
+ title="What possible venues are you considering?"></textarea>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-30"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-30"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-32">
- <div class="qNumber">
- Q.32
- </div>
-
- <div class="qContent">
- <div class="qText">
- Anything else you want us to know while we're looking over your application?
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-32">
+ <div class="qNumber">
+ Q.32
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT200">
- <textarea name="q_1079098_anything_else" class="large" rows="10" cols="40" title="Anything else you want us to know while we're looki…"></textarea>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ Anything else you want us to know while we're looking over your application?
+ </div>
+
+ <div class="PDF_QT200">
+ <textarea name="q_1079098_anything_else" class="large" rows="10" cols="40"
+ title="Anything else you want us to know while we're looki…"></textarea>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-32"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-32"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-10003">
- <div class="qContent">
- <div class="PDF_QT1900">
- <h2>Bonus Question!</h2>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-10003">
+ <div class="qContent">
+ <div class="PDF_QT1900">
+ <h2>Bonus Question!</h2>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-10003"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-10003"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question" id="pd-question-33">
- <div class="qNumber">
- Q.33
- </div>
-
- <div class="qContent">
- <div class="qText">
- Which of these best describes you?
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question" id="pd-question-33">
+ <div class="qNumber">
+ Q.33
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_QT400">
- <ul>
- <li>
- <input type="radio" name="q_1079112_best_describes_you" value="Personal Blogger" id="q_1079112_1926766" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="qContent">
+ <div class="qText">
+ Which of these best describes you?
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1079112_1926766" value="1926766">
- Personal Blogger </label>
- </li>
- <li>
- <input type="radio" name="q_1079112_best_describes_you" value="Company Blogger" id="q_1079112_1926767" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_QT400">
+ <ul>
+ <li>
+ <input type="radio" name="q_1079112_best_describes_you" value="Personal Blogger"
+ id="q_1079112_1926766"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1079112_1926767" value="1926767">
- Company Blogger </label>
- </li>
- <li>
- <input type="radio" name="q_1079112_best_describes_you" value="Designer" id="q_1079112_1926768" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1079112_1926766" value="1926766">
+ Personal Blogger </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1079112_best_describes_you" value="Company Blogger"
+ id="q_1079112_1926767"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1079112_1926768" value="1926768">
- Designer </label>
- </li>
- <li>
- <input type="radio" name="q_1079112_best_describes_you" value="Beginning Developer" id="q_1079112_1926769" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1079112_1926767" value="1926767">
+ Company Blogger </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1079112_best_describes_you" value="Designer"
+ id="q_1079112_1926768"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1079112_1926769" value="1926769">
- Beginning Developer </label>
- </li>
- <li>
- <input type="radio" name="q_1079112_best_describes_you" value="Advanced Developer" id="q_1079112_1926770" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1079112_1926768" value="1926768">
+ Designer </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1079112_best_describes_you" value="Beginning Developer"
+ id="q_1079112_1926769"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1079112_1926770" value="1926770">
- Advanced Developer </label>
- </li>
- <li>
- <input type="radio" name="q_1079112_best_describes_you" value="Project Manager" id="q_1079112_1926771" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1079112_1926769" value="1926769">
+ Beginning Developer </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1079112_best_describes_you" value="Advanced Developer"
+ id="q_1079112_1926770"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1079112_1926771" value="1926771">
- Project Manager </label>
- </li>
- <li>
- <input type="radio" name="q_1079112_best_describes_you" value="System Administrator/IT Professional" id="q_1079112_1926772" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1079112_1926770" value="1926770">
+ Advanced Developer </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1079112_best_describes_you" value="Project Manager"
+ id="q_1079112_1926771"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1079112_1926772" value="1926772">
- System Administrator/IT Professional </label>
- </li>
- <li>
- <input type="radio" name="q_1079112_best_describes_you" value="Sales/Marketing/PR" id="q_1079112_1926773" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1079112_1926771" value="1926771">
+ Project Manager </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1079112_best_describes_you"
+ value="System Administrator/IT Professional" id="q_1079112_1926772"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1079112_1926773" value="1926773">
- Sales/Marketing/PR </label>
- </li>
- <li>
- <input type="radio" name="q_1079112_best_describes_you" value="Business Owner" id="q_1079112_1926774" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1079112_1926772" value="1926772">
+ System Administrator/IT Professional </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1079112_best_describes_you" value="Sales/Marketing/PR"
+ id="q_1079112_1926773"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1079112_1926774" value="1926774">
- Business Owner </label>
- </li>
- <li>
- <input type="radio" name="q_1079112_best_describes_you" value="WordPress Fan" id="q_1079112_1926775" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1079112_1926773" value="1926773">
+ Sales/Marketing/PR </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1079112_best_describes_you" value="Business Owner"
+ id="q_1079112_1926774"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1079112_1926775" value="1926775">
- WordPress Fan </label>
- </li>
- <li>
- <input type="radio" name="q_1079112_best_describes_you" id="q_1079112_other" value="other" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1079112_1926774" value="1926774">
+ Business Owner </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1079112_best_describes_you" value="WordPress Fan"
+ id="q_1079112_1926775"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <label for="q_1079112_other">
- Other:
- </label>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1079112_1926775" value="1926775">
+ WordPress Fan </label>
+ </li>
+ <li>
+ <input type="radio" name="q_1079112_best_describes_you" id="q_1079112_other"
+ value="other"/>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <input type="text" class="other" name="q_1079112_best_describes_you_other" value="" style="width: 75%" />
- </li>
- </ul>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <label for="q_1079112_other">
+ Other:
+ </label>
+
+ <input type="text" class="other" name="q_1079112_best_describes_you_other" value=""
+ style="width: 75%"/>
+ </li>
+ </ul>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_questionDivide" id="pd-divider-33"></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_questionDivide" id="pd-divider-33"></div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="PDF_question">
- <div class="button">
- <input type="submit" name="submit-application" value="Submit Application" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="PDF_question">
+ <div class="button">
+ <input type="submit" name="submit-application" value="Submit Application"/>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div>
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div> <!-- PDF.pageInner -->
- </div> <!-- PDF.pageOuter -->
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ </div> <!-- PDF.pageInner -->
+ </div> <!-- PDF.pageOuter -->
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-</form>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ </form>
+
+ <?php
+}
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of file
</span></span></pre></div>
<a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptviewswordcampmetaboxstatusphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/views/wordcamp/metabox-status.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/views/wordcamp/metabox-status.php 2018-08-13 07:28:19 UTC (rev 7606)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/views/wordcamp/metabox-status.php 2018-08-13 11:52:14 UTC (rev 7607)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1,22 +1,33 @@
</span><span class="cx" style="display: block; padding: 0 10px"> <?php
</span><span class="cx" style="display: block; padding: 0 10px"> defined( 'WPINC' ) || die();
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-$wcpt = get_post_type_object( WCPT_POST_TYPE_ID );
-?>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+/**
+ * Renders the status metabox for events. Will display current status of the event. If user has edit_post access then will display dropdown of all available statuses for this post.
+ *
+ * @param Event_Admin $event_admin Event admin object. Must have methods `get_valid_status_transitions` and `get_post_statuses`
+ * @param WP_Post $post Post object
+ * @param string $event_type Type of event. Could be 'wordcamp' or 'wp_meetup'.
+ * @param string $label Label to display. Could be 'WordCamp' or 'Meetup' as of now.
+ * @param string $edit_capability Name of the capability which allows to edit the event
+ */
+function render_event_metabox( $event_admin, $post, $event_type, $label, $edit_capability ) {
+ $wcpt = get_post_type_object( $event_type );
+ ?>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-<div id="submitpost" class="wcb submitbox">
- <div id="minor-publishing">
- <div id="misc-publishing-actions">
- <div class="misc-pub-section misc-pub-post-status">
- <label>
- WordCamp Status:
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div id="submitpost" class="wcb submitbox">
+ <div id="minor-publishing">
+ <div id="misc-publishing-actions">
+ <div class="misc-pub-section misc-pub-post-status">
+ <label>
+ <?php echo $label; ?> Status:
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <?php if ( current_user_can( 'wordcamp_wrangle_wordcamps' ) ) : ?>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <?php if ( current_user_can( $edit_capability ) ) : ?>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <span id="post-status-display">
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <span id="post-status-display">
</ins><span class="cx" style="display: block; padding: 0 10px"> <select name="post_status">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <?php $transitions = WordCamp_Loader::get_valid_status_transitions( $post->post_status ); ?>
- <?php foreach ( WordCamp_Loader::get_post_statuses() as $key => $label ) : ?>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <?php $transitions = $event_admin->get_valid_status_transitions( $post->post_status );
+ ?>
+ <?php foreach ( $event_admin->get_post_statuses() as $key => $label ) : ?>
</ins><span class="cx" style="display: block; padding: 0 10px"> <?php $status = get_post_status_object( $key ); ?>
</span><span class="cx" style="display: block; padding: 0 10px"> <option value="<?php echo esc_attr( $status->name ); ?>" <?php
</span><span class="cx" style="display: block; padding: 0 10px"> if ( $post->post_status == $status->name ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -31,9 +42,9 @@
</span><span class="cx" style="display: block; padding: 0 10px"> </select>
</span><span class="cx" style="display: block; padding: 0 10px"> </span>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <?php else : ?>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <?php else : ?>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <span id="post-status-display">
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <span id="post-status-display">
</ins><span class="cx" style="display: block; padding: 0 10px"> <?php
</span><span class="cx" style="display: block; padding: 0 10px"> $status = get_post_status_object( $post->post_status );
</span><span class="cx" style="display: block; padding: 0 10px"> echo esc_html( $status->label );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -40,29 +51,31 @@
</span><span class="cx" style="display: block; padding: 0 10px"> ?>
</span><span class="cx" style="display: block; padding: 0 10px"> </span>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <?php endif; ?>
- </label>
- </div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <?php endif; ?>
+ </label>
+ </div>
+ <div class="clear"></div>
+ </div> <!-- #misc-publishing-actions -->
+
</ins><span class="cx" style="display: block; padding: 0 10px"> <div class="clear"></div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- </div> <!-- #misc-publishing-actions -->
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ </div> <!-- #minor-publishing -->
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="clear"></div>
- </div> <!-- #minor-publishing -->
-
- <div id="major-publishing-actions">
- <div id="delete-action">
- <?php if ( current_user_can( $wcpt->cap->delete_post, $post->ID ) ) : ?>
- <a class="submitdelete deletion" href="<?php echo get_delete_post_link( $post->ID ); ?>">
- <?php _e( 'Delete', 'wordcamporg' ); ?>
- </a>
- <?php endif; ?>
- </div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div id="major-publishing-actions">
+ <div id="delete-action">
+ <?php if ( current_user_can( $wcpt->cap->delete_post, $post->ID ) ) : ?>
+ <a class="submitdelete deletion" href="<?php echo get_delete_post_link( $post->ID ); ?>">
+ <?php _e( 'Delete', 'wordcamporg' ); ?>
+ </a>
+ <?php endif; ?>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div id="publishing-action">
- <?php submit_button( 'Update', 'primary button-large', 'wcpt-update', false, array( 'accesskey' => 'p' ) ); ?>
- </div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div id="publishing-action">
+ <?php submit_button( 'Update', 'primary button-large', 'wcpt-update', false, array( 'accesskey' => 'p' ) ); ?>
+ </div>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="clear"></div>
- </div> <!-- #major-publishing-actions -->
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <div class="clear"></div>
+ </div> <!-- #major-publishing-actions -->
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-</div> <!-- .submitbox -->
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ </div> <!-- .submitbox -->
+ <?php
+}
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of file
</span></span></pre></div>
<a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcpteventclasseventadminphp"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-event/class-event-admin.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-event/class-event-admin.php (rev 0)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-event/class-event-admin.php 2018-08-13 11:52:14 UTC (rev 7607)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,575 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+<?php
+/**
+ * Implement Event_Admin class
+ *
+ * @package WordCamp Post Type
+ */
+
+/**
+ * Class Event_Admin
+ *
+ * Abstract class providing common functions for event admins
+ *
+ * @package WordCamp Post Type
+ * @subpackage Admin
+ */
+abstract class Event_Admin {
+
+ /**
+ * Event_Admin constructor.
+ */
+ public function __construct() {
+ add_action( 'add_meta_boxes', array( $this, 'metabox' ) );
+
+ add_action( 'add_meta_boxes', array( $this, 'add_status_metabox' ) );
+
+ add_action( 'add_meta_boxes', array( $this, 'add_log_metabox' ) );
+
+ add_action( 'add_meta_boxes', array( $this, 'add_note_metabox' ) );
+
+ add_action( 'add_meta_boxes', array( $this, 'add_original_application' ) );
+
+ add_action( 'save_post_' . $this->get_event_type(), array( $this, 'metabox_save' ), 10, 2 );
+
+ add_action( 'manage_posts_custom_column', array( $this, 'column_data' ), 10, 2 );
+
+ add_filter( 'post_row_actions', array( $this, 'post_row_actions' ), 10, 2 );
+
+ add_filter(
+ 'manage_' . $this->get_event_type() . '_posts_columns', array(
+ $this,
+ 'column_headers',
+ )
+ );
+ // Forum column headers.
+ add_filter( 'display_post_states', array( $this, 'display_post_states' ) );
+
+ add_action( 'admin_enqueue_scripts', array( $this, 'common_admin_scripts' ) );
+
+ add_action( 'admin_print_styles', array( $this, 'common_admin_styles' ) );
+
+ add_action( 'transition_post_status', array( $this, 'log_status_changes' ), 10, 3 );
+ }
+
+ /**
+ * Get all possible valid transitions from given status.
+ *
+ * @param string $status Name of status.
+ *
+ * @return array List of all valid transitions.
+ */
+ abstract public static function get_valid_status_transitions( $status );
+
+ /**
+ * List of all possible status.
+ *
+ * @return array
+ */
+ abstract public static function get_post_statuses();
+
+ /**
+ * Get post type
+ *
+ * @return string
+ */
+ abstract public static function get_event_type();
+
+ /**
+ * Get user facing event label
+ *
+ * @return string
+ */
+ abstract public static function get_event_label();
+
+ /**
+ * Get meta key group
+ *
+ * @param string $meta_group Name of meta group.
+ *
+ * @return array
+ */
+ abstract public static function meta_keys( $meta_group = '' );
+
+ /**
+ * Check if $key is a read-only field
+ *
+ * @param string $key Name of the field.
+ *
+ * @return bool
+ */
+ abstract public static function is_protected_field( $key );
+
+ /**
+ * Add metaboxes to admin view
+ */
+ abstract public function metabox();
+
+ /**
+ * Render column data for a given column
+ *
+ * @param string $column Name of column.
+ * @param int $post_id Post ID.
+ */
+ abstract public function column_data( $column, $post_id );
+
+ /**
+ * Change post row actions
+ *
+ * @param array $actions Array of actions.
+ * @param WP_Post $post Post object.
+ */
+ abstract public function post_row_actions( $actions, $post );
+
+ /**
+ * Render column headers
+ *
+ * @param array $columns List of columns.
+ */
+ abstract public function column_headers( $columns );
+
+ /**
+ * Add status metabox
+ */
+ public function add_status_metabox() {
+ add_meta_box(
+ 'submitdiv',
+ __( 'Status', 'wordcamporg' ),
+ array( $this, 'metabox_status' ),
+ $this->get_event_type(),
+ 'side',
+ 'high'
+ );
+
+ }
+
+ /**
+ * Add log meta box to application
+ */
+ public function add_log_metabox() {
+ if ( ! current_user_can( $this->get_edit_capability() ) ) {
+ return;
+ }
+
+ add_meta_box(
+ 'wcpt_log',
+ 'Log',
+ 'wcpt_log_metabox',
+ $this->get_event_type(),
+ 'advanced',
+ 'low'
+ );
+
+ }
+
+ /**
+ * Add note metabox to application
+ */
+ public function add_note_metabox() {
+ if ( ! current_user_can( $this->get_edit_capability() ) ) {
+ return;
+ }
+
+ add_meta_box(
+ 'wcpt_notes',
+ __( 'Add Private Note', 'wordcamporg' ),
+ 'wcpt_add_note_metabox',
+ $this->get_event_type(),
+ 'side',
+ 'low'
+ );
+ }
+
+ /**
+ * Add original application metabox
+ */
+ public function add_original_application() {
+ if ( ! current_user_can( $this->get_edit_capability() ) ) {
+ return;
+ }
+
+ add_meta_box(
+ 'wcpt_original_application',
+ 'Original Application',
+ array( $this, 'original_application_metabox' ),
+ $this->get_event_type(),
+ 'advanced',
+ 'low'
+ );
+ }
+
+ /**
+ * Render the Original application
+ *
+ * @param WP_Post $post Current post.
+ */
+ public function original_application_metabox( $post ) {
+ $application_data = get_post_meta( $post->ID, '_application_data', true );
+ require_once WCPT_DIR . 'views/wordcamp/metabox-original-application.php';
+ }
+
+ /**
+ * Render the WordCamp status meta box.
+ *
+ * @param WP_Post $post Current post object.
+ */
+ public function metabox_status( $post ) {
+ require_once WCPT_DIR . 'views/wordcamp/metabox-status.php';
+
+ render_event_metabox( $this, $post, $this->get_event_type(), $this->get_event_label(), $this->get_edit_capability() );
+ }
+
+ /**
+ * Gets name of capability required to edit the current event
+ *
+ * @return string
+ */
+ abstract public static function get_edit_capability();
+
+ /**
+ * Log when the post status changes
+ *
+ * @param string $new_status New status.
+ * @param string $old_status Old status.
+ * @param WP_Post $post Current Post.
+ */
+ public function log_status_changes( $new_status, $old_status, $post ) {
+ if ( $new_status === $old_status || 'auto-draft' === $new_status ) {
+ return;
+ }
+
+ if ( empty( $post->post_type ) || $this->get_event_type() !== $post->post_type ) {
+ return;
+ }
+
+ $old_status = get_post_status_object( $old_status );
+ $new_status = get_post_status_object( $new_status );
+
+ add_post_meta(
+ $post->ID, '_status_change', array(
+ 'timestamp' => time(),
+ 'user_id' => get_current_user_id(),
+ 'message' => sprintf( '%s → %s', $old_status->label, $new_status->label ),
+ )
+ );
+ }
+
+
+ /**
+ * Load common admin side scripts
+ */
+ public function common_admin_scripts() {
+
+ if ( $this->get_event_type() !== get_post_type() ) {
+ return;
+ }
+
+ wp_register_script(
+ 'wcpt-admin',
+ WCPT_URL . 'javascript/wcpt-wordcamp/admin.js',
+ array( 'jquery', 'jquery-ui-datepicker' ),
+ WCPT_VERSION,
+ true
+ );
+
+ wp_enqueue_script( 'wcpt-admin' );
+ wp_enqueue_script( 'select2' );
+
+ }
+
+ /**
+ * Load common admin styles
+ */
+ public function common_admin_styles() {
+
+ if ( $this->get_event_type() !== get_post_type() ) {
+ return;
+ }
+
+ wp_register_style(
+ 'wcpt-admin',
+ plugins_url( 'css/applications/admin.css', __DIR__ ),
+ array(),
+ WCPT_VERSION
+ );
+
+ wp_enqueue_style( 'jquery-ui' );
+ wp_enqueue_style( 'wp-datepicker-skins' );
+ wp_enqueue_style( 'select2' );
+ wp_enqueue_style( 'wcpt-admin' );
+
+ }
+
+ /**
+ * Display the status of a WordCamp post
+ *
+ * @param array $states List of post states.
+ *
+ * @return array
+ */
+ public function display_post_states( $states ) {
+ global $post;
+
+ if ( $post->post_type !== $this->get_event_type() ) {
+ return $states;
+ }
+
+ $status = get_post_status_object( $post->post_status );
+ if ( get_query_var( 'post_status' ) !== $post->post_status ) {
+ $states[ $status->name ] = $status->label;
+ }
+
+ return $states;
+ }
+
+ /**
+ * Save metadata from form
+ *
+ * @param int $post_id Post ID.
+ * @param WP_Post $post Post Object.
+ */
+ public function metabox_save( $post_id, $post ) {
+ // Don't add/remove meta on revisions and auto-saves.
+ if ( wp_is_post_autosave( $post_id ) || wp_is_post_revision( $post_id ) ) {
+ return;
+ }
+
+ // Don't add/remove meta on trash, untrash, restore, etc.
+ if ( empty( $_POST['action'] ) || 'editpost' !== $_POST['action'] ) {
+ return;
+ }
+
+ if ( $this->get_event_type() !== get_post_type() ) {
+ return;
+ }
+
+ // Make sure the requset came from the edit post screen.
+ if ( empty( $_POST['_wpnonce'] ) || ! wp_verify_nonce( $_POST['_wpnonce'], 'update-post_' . $post_id ) ) {
+ return;
+ }
+
+ $meta_keys = $this->meta_keys();
+
+ foreach ( $meta_keys as $key => $value ) {
+ $post_value = wcpt_key_to_str( $key, 'wcpt_' );
+ $values[ $key ] = isset( $_POST[ $post_value ] ) ? esc_attr( $_POST[ $post_value ] ) : '';
+
+ // Don't update protected fields
+ if ( $this->is_protected_field( $key ) ) {
+ continue;
+ }
+
+ switch ( $value ) {
+ case 'text':
+ case 'textarea':
+ update_post_meta( $post_id, $key, $values[ $key ] );
+ break;
+
+ case 'number':
+ update_post_meta( $post_id, $key, floatval( $values[ $key ] ) );
+ break;
+
+ case 'checkbox':
+ if ( ! empty( $values[ $key ] ) && 'on' == $values[ $key ] ) {
+ update_post_meta( $post_id, $key, true );
+ } else {
+ update_post_meta( $post_id, $key, false );
+ }
+ break;
+
+ case 'date':
+ if ( ! empty( $values[ $key ] ) ) {
+ $values[ $key ] = strtotime( $values[ $key ] );
+ }
+
+ update_post_meta( $post_id, $key, $values[ $key ] );
+ break;
+
+ case 'select-currency':
+ $currencies = WordCamp_Budgets::get_currencies();
+ $new_value = ( array_key_exists( $values[ $key ], $currencies ) ) ? $values[ $key ] : '';
+
+ update_post_meta( $post_id, $key, $new_value );
+ break;
+
+ default:
+ do_action( 'wcpt_metabox_save', $key, $value, $post_id );
+ break;
+ }
+ }
+
+ do_action( 'wcpt_metabox_save_done', $post_id );
+
+ $this->validate_and_add_note( $post_id );
+
+ }
+
+ /**
+ * Validate and add a new private note
+ *
+ * @param int $post_id
+ */
+ protected function validate_and_add_note( $post_id ) {
+ if ( empty( $_POST['wcpt_new_note'] ) ) {
+ return;
+ }
+
+ check_admin_referer( 'wcpt_notes', 'wcpt_notes_nonce' );
+
+ $new_note_message = sanitize_text_field( wp_unslash( $_POST['wcpt_new_note'] ) );
+
+ if ( empty( $new_note_message ) ) {
+ return;
+ }
+
+ // Note that this is private, see wcpt_get_log_entries()
+ add_post_meta(
+ $post_id, '_note', array(
+ 'timestamp' => time(),
+ 'user_id' => get_current_user_id(),
+ 'message' => $new_note_message,
+ )
+ );
+ }
+
+ /**
+ * Displays meta boxes in admin view.
+ *
+ * @param array $required_fields Required fields.
+ * @param array $meta_keys List of meta keys.
+ * @param array $messages List of messages to displayed by a key.
+ * @param int $post_id ID of post.
+ * @param array $protected_fields List of read only fields.
+ */
+ public static function display_meta_boxes(
+ $required_fields,
+ $meta_keys,
+ $messages,
+ $post_id,
+ $protected_fields
+ ) {
+
+ foreach ( $meta_keys as $key => $value ) :
+ $object_name = wcpt_key_to_str( $key, 'wcpt_' );
+ $readonly = in_array( $key, $protected_fields ) ? ' readonly="readonly"' : '';
+ ?>
+
+ <div class="inside">
+ <?php if ( 'checkbox' == $value ) : ?>
+
+ <p>
+ <strong><?php echo $key; ?></strong>:
+ <input type="checkbox" name="<?php echo $object_name; ?>"
+ id="<?php echo $object_name; ?>" <?php checked( get_post_meta( $post_id, $key, true ) ); ?><?php echo $readonly; ?> />
+ </p>
+
+ <?php else : ?>
+
+ <p>
+ <strong><?php echo $key; ?></strong>
+ <?php if ( in_array( $key, $required_fields, true ) ) : ?>
+ <span class="description"><?php _e( '(required)', 'wordcamporg' ); ?></span>
+ <?php endif; ?>
+ </p>
+
+ <p>
+ <label class="screen-reader-text"
+ for="<?php echo $object_name; ?>"><?php echo $key; ?></label>
+
+ <?php
+ switch ( $value ) :
+ case 'text':
+ ?>
+
+ <input type="text" size="36" name="<?php echo $object_name; ?>"
+ id="<?php echo $object_name; ?>"
+ value="<?php echo esc_attr( get_post_meta( $post_id, $key, true ) ); ?>"<?php echo $readonly; ?> />
+
+ <?php
+ break;
+ case 'number':
+ ?>
+
+ <input type="number" size="16" name="<?php echo $object_name; ?>"
+ id="<?php echo $object_name; ?>"
+ value="<?php echo esc_attr( get_post_meta( $post_id, $key, true ) ); ?>"
+ step="any" min="0"<?php echo $readonly; ?> />
+
+ <?php
+ break;
+ case 'date':
+ // Quick filter on dates
+ if ( $date = get_post_meta( $post_id, $key, true ) ) {
+ $date = date( 'Y-m-d', $date );
+ }
+
+ ?>
+
+ <input type="text" size="36" class="date-field" name="<?php echo $object_name; ?>"
+ id="<?php echo $object_name; ?>"
+ value="<?php echo $date; ?>"<?php echo $readonly; ?> />
+
+ <?php
+ break;
+ case 'textarea':
+ ?>
+
+ <textarea rows="4" cols="23" name="<?php echo $object_name; ?>"
+ id="<?php echo $object_name; ?>"<?php echo $readonly; ?>><?php echo esc_attr( get_post_meta( $post_id, $key, true ) ); ?></textarea>
+
+ <?php
+ break;
+ case 'select-currency':
+ $currencies = WordCamp_Budgets::get_currencies();
+ ?>
+
+ <?php
+ if ( $readonly ) :
+ $value = get_post_meta( $post_id, $key, true );
+ ?>
+ <select name="<?php echo $object_name; ?>"
+ id="<?php echo $object_name; ?>"<?php echo $readonly; ?>>
+ <option value="<?php echo esc_attr( $value ); ?>" selected>
+ <?php echo ( $value ) ? esc_html( $currencies[ $value ] . ' (' . $value . ')' ) : ''; ?>
+ </option>
+ </select>
+ <?php else : ?>
+ <select name="<?php echo esc_attr( $object_name ); ?>"
+ id="<?php echo esc_attr( $object_name ); ?>" class="select-currency">
+ <?php foreach ( $currencies as $symbol => $name ) : ?>
+ <option value="<?php echo esc_attr( $symbol ); ?>"<?php selected( $symbol, get_post_meta( $post_id, $key, true ) ); ?>>
+ <?php echo ( $symbol ) ? esc_html( $name . ' (' . $symbol . ')' ) : ''; ?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ <?php endif; ?>
+
+ <?php
+ break;
+
+ default:
+ do_action( 'wcpt_metabox_value', $key, $value, $object_name );
+ break;
+
+ endswitch;
+ ?>
+
+ <?php if ( ! empty( $messages[ $key ] ) ) : ?>
+ <?php
+ if ( 'textarea' == $value ) {
+ echo '<br />';
+ }
+ ?>
+
+ <span class="description"><?php echo esc_html( $messages[ $key ] ); ?></span>
+ <?php endif; ?>
+ </p>
+
+ <?php endif; ?>
+ </div>
+
+ <?php
+ endforeach;
+ }
+
+
+}
</ins><span class="cx" style="display: block; padding: 0 10px">Property changes on: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-event/class-event-admin.php
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:eol-style</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+native
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcpteventclasseventapplicationphp"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-event/class-event-application.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-event/class-event-application.php (rev 0)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-event/class-event-application.php 2018-08-13 11:52:14 UTC (rev 7607)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,204 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+<?php
+/**
+ * Implement abstract class for Event_Application
+ *
+ * @package WordCamp Post Type
+ */
+
+namespace WordPress_Community\Applications;
+
+/**
+ * Class Event_Application
+ * Provides interface for event application
+ *
+ * @package WordPress_Community\Applications
+ */
+abstract class Event_Application {
+
+ /**
+ * Get user facing string of event type.
+ *
+ * @return string
+ */
+ abstract public static function get_event_label();
+
+ /**
+ * Get post type.
+ *
+ * @return string
+ */
+ abstract public static function get_event_type();
+
+ /**
+ * Common assets used by all event types.
+ */
+ public function enqueue_common_assets() {
+ wp_register_style(
+ 'wp-community-applications',
+ plugins_url( 'css/applications/common.css', __DIR__ ),
+ array(),
+ 1
+ );
+
+ wp_enqueue_style( 'wp-community-applications' );
+ }
+
+ /**
+ * Render the output the of the [meetup-organizer-application] shortcode.
+ *
+ * @todo Use force_login_to_view_form() and populate_form_based_on_user().
+ *
+ * @return string
+ */
+ public function render_application_shortcode() {
+ ob_start();
+
+ if ( isset( $_POST['submit-application'] ) ) {
+ $this->submit_application();
+ } else {
+ $countries = wcorg_get_countries();
+ $this->render_application_form( $countries );
+ }
+
+ return ob_get_clean();
+ }
+
+ /**
+ * Render event application from for organizer.
+ *
+ * @param array $countries List of countries.
+ *
+ * @return null
+ */
+ abstract public function render_application_form( $countries );
+
+ /**
+ * Submit application details. Calls `create_post` to actually create the event.
+ */
+ public function submit_application() {
+ $application_data = $this->validate_data( $_POST );
+ if ( $this->is_rate_limited() ) {
+ $message = __( 'You have submitted too many applications recently. Please wait and try again in a few hours.', 'wordcamporg' );
+ $notice_classes = 'notice-error';
+ } elseif ( is_wp_error( $application_data ) ) {
+ $message = $application_data->get_error_message();
+ $notice_classes = 'notice-error';
+ } else {
+ $this->create_post( $application_data );
+ $this->notify_applicant_application_received( $this->get_organizer_email(), $this->get_event_location() );
+ $message = __( "Thank you for your application! We've received it, and we'll contact you once we've had a chance to review it.", 'wordcamporg' );
+ $notice_classes = 'notice-success';
+ }
+
+ $this->display_notice( $message, $notice_classes );
+ }
+
+ /**
+ * Validate application data. Returns either error object or data.
+ *
+ * @param array $unsafe_data
+ *
+ * @return array|\WP_Error
+ */
+ abstract public function validate_data( $unsafe_data );
+
+ /**
+ * Create and insert post into DB
+ *
+ * @param array $application_data
+ *
+ * @return bool
+ */
+ abstract public function create_post( $application_data );
+
+
+ /**
+ * Check if the application submitter has been rate limited
+ *
+ * This isn't really designed to protect against DDoS or anything sophisticated; it just prevents us from having
+ * to clean up thousands of fake applications when security researchers use bots to probe for vulnerabilities.
+ *
+ * @return bool
+ */
+ public function is_rate_limited() {
+ $limit = 3;
+
+ $previous_entries = get_posts(
+ array(
+ 'post_type' => $this->get_event_type(),
+ 'post_status' => get_post_stati(), // This will include trashed posts, unlike 'any'.
+ 'posts_per_page' => $limit,
+ 'orderby' => 'date',
+ 'order' => 'DESC',
+ 'fields' => 'ids',
+
+ 'date_query' => array(
+ array(
+ 'column' => 'post_date',
+ 'after' => '1 hour ago',
+ 'inclusive' => true,
+ ),
+ ),
+
+ 'meta_query' => array(
+ array(
+ 'key' => '_application_submitter_ip_address',
+ 'value' => $_SERVER['REMOTE_ADDR'],
+ ),
+ ),
+ )
+ );
+
+ return count( $previous_entries ) >= $limit;
+ }
+
+ /**
+ * Get email of organizer if set
+ *
+ * @return string|null
+ */
+ abstract public function get_organizer_email();
+
+ /**
+ * Get location of event if set.
+ *
+ * @return string|null
+ */
+ abstract public function get_event_location();
+
+ /**
+ * Display a notice to applicant while submitting the form.
+ *
+ * @param string $message Message to be displayed.
+ * @param string $notice_classes Space separated list of classes to be applied to message div.
+ */
+ public function display_notice( $message, $notice_classes ) {
+ ?>
+ <div class="notice notice-large <?php echo esc_attr( $notice_classes ); ?>">
+ <?php echo esc_html( $message ); ?>
+ </div>
+ <?php
+ }
+
+ /**
+ * Notify the applicant that we've received their application
+ *
+ * @param string $email_address
+ * @param string $meetup_city
+ */
+ public function notify_applicant_application_received( $email_address, $meetup_city ) {
+ //translators: Name of the event. Egs WordCamp.
+ $subject = sprintf( __( "We've received your %s application", 'wpct' ), $this->get_event_label() );
+ $headers = array( 'Reply-To: support@wordcamp.org' );
+ //translators: Name and city of the event. Egs WordCamp in New York.
+ $message = sprintf(
+ __(
+ "Thank you for applying to organize a %s in %s! We'll send you a follow-up e-mail once we've had a chance to review your application.",
+ 'wpct'
+ ),
+ $this->get_event_label(), sanitize_text_field( $meetup_city )
+ );
+
+ wp_mail( $email_address, $subject, $message, $headers );
+ }
+}
</ins><span class="cx" style="display: block; padding: 0 10px">Property changes on: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-event/class-event-application.php
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:eol-style</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+native
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcpteventclasseventloaderphp"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-event/class-event-loader.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-event/class-event-loader.php (rev 0)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-event/class-event-loader.php 2018-08-13 11:52:14 UTC (rev 7607)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,111 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+<?php
+/**
+ * Implements Event_Loader class
+ *
+ * @package WordCamp Post Type
+ */
+
+/**
+ * Class Event_Loader
+ */
+abstract class Event_Loader {
+
+ /**
+ * Event_Loader constructor. Add common hooks.
+ */
+ public function __construct() {
+ add_action( 'plugins_loaded', array( $this, 'includes' ) );
+ add_action( 'init', array( $this, 'register_post_types' ) );
+ add_action( 'init', array( $this, 'register_post_capabilities' ) );
+ add_action( 'init', array( $this, 'register_post_statuses' ) );
+ add_filter( 'pre_get_posts', array( $this, 'query_public_statuses_on_archives' ) );
+ }
+
+ /**
+ * Include all event specific dependent files.
+ *
+ * @return void
+ */
+ abstract protected function includes();
+
+ /**
+ * Register event custom post type.
+ *
+ * @return void
+ */
+ abstract protected function register_post_types();
+
+ /**
+ * Add capabilities to roles for post type.
+ *
+ * @return void
+ */
+ abstract protected function register_post_capabilities();
+
+ /**
+ * Return list of available post statuses with their labels.
+ *
+ * @return array
+ */
+ abstract public static function get_post_statuses();
+
+ /**
+ * Register post statuses for this event type.
+ */
+ public function register_post_statuses() {
+ foreach ( $this->get_post_statuses() as $key => $label ) {
+ register_post_status(
+ $key, array(
+ 'label' => $label,
+ 'public' => true,
+ 'label_count' => _nx_noop(
+ sprintf( '%s <span class="count">(%s)</span>', $label, '%s' ),
+ sprintf( '%s <span class="count">(%s)</span>', $label, '%s' ),
+ 'wordcamporg'
+ ),
+ )
+ );
+ }
+ }
+
+ /**
+ * List of statuses when an Event can be tracked in any public facing widget.
+ *
+ * @return array
+ */
+ abstract public static function get_public_post_statuses();
+
+ /**
+ * Only query the public post statuses on WordCamp archives and feeds
+ *
+ * By default, any public post statuses are queried when the `post_status` parameter is not explicitly passed
+ * to WP_Query. This causes central.wordcamp.org/wordcamps/ and central.wordcamp.org/wordcamps/feed/ to display
+ * camps that are `needs-vetting`, etc, which is not desired.
+ *
+ * Another way to fix this would have been to register some of the posts statuses as `private`, but they're not
+ * consistently used in a public or private way, so that would have had more side effects.
+ *
+ * @param WP_Query $query
+ */
+ public function query_public_statuses_on_archives( $query ) {
+ if ( ! $query->is_post_type_archive( WCPT_POST_TYPE_ID ) ) {
+ return;
+ }
+
+ if ( is_admin() ) {
+ return;
+ }
+
+ // Sort by the date it was added to the schedule. See WordCamp_Loader::set_scheduled_date() for details.
+ if ( '' === $query->get( 'orderby' ) ) {
+ $query->set( 'orderby', 'menu_order date' );
+ }
+
+ if ( ! empty( $query->query_vars['post_status'] ) ) {
+ return;
+ }
+
+ $query->query_vars['post_status'] = $this->get_public_post_statuses();
+ }
+
+}
</ins><span class="cx" style="display: block; padding: 0 10px">Property changes on: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-event/class-event-loader.php
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:eol-style</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+native
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcpteventtrackerphp"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-event/tracker.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-event/tracker.php (rev 0)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-event/tracker.php 2018-08-13 11:52:14 UTC (rev 7607)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,137 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+<?php
+
+namespace WordPress_Community\Applications\Tracker;
+
+use \WordCamp_Loader;
+defined( 'WPINC' ) or die();
+
+const SHORTCODE_SLUG = 'application-tracker';
+
+add_shortcode( SHORTCODE_SLUG, __NAMESPACE__ . '\render_status_shortcode' );
+add_action( 'wp_enqueue_scripts', __NAMESPACE__ . '\enqueue_scripts' );
+
+/**
+ * Render the [application-tracker] shortcode.
+ */
+function render_status_shortcode() {
+ return '<div id="wpc-application-tracker">Loading Application Tracker...</div>';
+}
+
+/**
+ * Get camps that are active enough to be shown on the tracker
+ *
+ * @return array
+ */
+function get_active_wordcamps() {
+ $wordcamps = array();
+ $statuses = WordCamp_Loader::get_post_statuses();
+ $milestones = WordCamp_Loader::map_statuses_to_milestones();
+ $inactive_timestamp = strtotime( '60 days ago' );
+
+ $shown_statuses = $statuses;
+ unset( $shown_statuses[ WCPT_FINAL_STATUS ] );
+ $shown_statuses = array_keys( $shown_statuses );
+
+ $raw_posts = get_posts(
+ array(
+ 'post_type' => WCPT_POST_TYPE_ID,
+ 'post_status' => $shown_statuses,
+ 'posts_per_page' => 300,
+ 'order' => 'ASC',
+ 'orderby' => 'post_title',
+ )
+ );
+
+ foreach ( $raw_posts as $key => $post ) {
+ $last_update_timestamp = get_last_update_timestamp( $post->ID );
+
+ if ( $last_update_timestamp <= $inactive_timestamp ) {
+ continue;
+ }
+
+ $wordcamps[] = array(
+ 'city' => $post->post_title,
+ 'cityUrl' => filter_var( get_post_meta( $post->ID, 'URL', true ), FILTER_VALIDATE_URL ),
+ 'applicant' => get_post_meta( $post->ID, 'Organizer Name', true ),
+ 'milestone' => $milestones[ $post->post_status ],
+ 'status' => $statuses[ $post->post_status ],
+ 'lastUpdate' => human_time_diff( time(), $last_update_timestamp ) . ' ago',
+ );
+ }
+
+ return $wordcamps;
+}
+
+/**
+ * Get the timestamp of the last time the post status changed
+ *
+ * @param int $post_id
+ *
+ * @return int
+ */
+function get_last_update_timestamp( $post_id ) {
+ $last_update_timestamp = 0;
+ $status_changes = get_post_meta( $post_id, '_status_change' );
+
+ if ( $status_changes ) {
+ usort( $status_changes, 'wcpt_sort_log_entries' );
+ $last_update_timestamp = $status_changes[0]['timestamp'];
+ }
+
+ return $last_update_timestamp;
+}
+
+/**
+ * Enqueue scripts and styles
+ */
+function enqueue_scripts() {
+ global $post;
+
+ wp_register_script(
+ 'wpc-application-tracker',
+ plugins_url( 'javascript/tracker/build/applications.min.js', dirname( __FILE__ ) ), // this file was renamed from 'tracker', which was getting flagged by ad blockers
+ array(),
+ 1,
+ true
+ );
+
+ wp_register_style(
+ 'wpc-application-tracker',
+ plugins_url( 'javascript/tracker/build/applications.min.css', dirname( __FILE__ ) ), // this file was renamed from 'tracker', which was getting flagged by ad blockers
+ array( 'dashicons', 'list-tables' ),
+ 1
+ );
+
+ if ( ! is_a( $post, 'WP_POST' ) || ! has_shortcode( $post->post_content, SHORTCODE_SLUG ) ) {
+ return;
+ }
+
+ wp_enqueue_script( 'wpc-application-tracker' );
+
+ wp_localize_script(
+ 'wpc-application-tracker',
+ 'wpcApplicationTracker',
+ array(
+ 'applications' => get_active_wordcamps(),
+ 'displayColumns' => get_display_columns(),
+ 'initialSortField' => 'city',
+ )
+ );
+
+ wp_enqueue_style( 'wpc-application-tracker' );
+}
+
+/**
+ * Get the columns headers
+ *
+ * @return array
+ */
+function get_display_columns() {
+ return array(
+ 'city' => 'City',
+ 'applicant' => 'Applicant',
+ 'milestone' => 'Milestone',
+ 'status' => 'Status',
+ 'lastUpdate' => 'Updated',
+ );
+}
</ins><span class="cx" style="display: block; padding: 0 10px">Property changes on: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-event/tracker.php
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:eol-style</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+native
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcptfunctionsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-functions.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-functions.php 2018-08-13 07:28:19 UTC (rev 7606)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-functions.php 2018-08-13 11:52:14 UTC (rev 7607)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -71,11 +71,11 @@
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span><span class="cx" style="display: block; padding: 0 10px"> * Get all the the entries
</span><span class="cx" style="display: block; padding: 0 10px"> *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * @param int $wordcamp_id
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @param int $event_id
</ins><span class="cx" style="display: block; padding: 0 10px"> *
</span><span class="cx" style="display: block; padding: 0 10px"> * @return array
</span><span class="cx" style="display: block; padding: 0 10px"> */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-function wcpt_get_log_entries( $wordcamp_id ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+function wcpt_get_log_entries( $event_id ) {
</ins><span class="cx" style="display: block; padding: 0 10px"> /*
</span><span class="cx" style="display: block; padding: 0 10px"> * @todo Rename `_note` meta fields to `_private_note` to make it obvious to devs that the value should be
</span><span class="cx" style="display: block; padding: 0 10px"> * treated as private. The `get_post_metadata` filter can be used to support back-compat w/out having to
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -82,8 +82,8 @@
</span><span class="cx" style="display: block; padding: 0 10px"> * rename old entries in database.
</span><span class="cx" style="display: block; padding: 0 10px"> */
</span><span class="cx" style="display: block; padding: 0 10px"> $entries = array();
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- $private_notes = get_post_meta( $wordcamp_id, '_note' );
- $status_changes = get_post_meta( $wordcamp_id, '_status_change' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $private_notes = get_post_meta( $event_id, '_note' );
+ $status_changes = get_post_meta( $event_id, '_status_change' );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><span class="cx" style="display: block; padding: 0 10px"> foreach ( array( 'note' => $private_notes, 'status_change' => $status_changes ) as $entry_type => $raw_entries ) {
</span><span class="cx" style="display: block; padding: 0 10px"> foreach ( $raw_entries as $entry ) {
</span></span></pre></div>
<a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcptloaderphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-loader.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-loader.php 2018-08-13 07:28:19 UTC (rev 7606)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-loader.php 2018-08-13 11:52:14 UTC (rev 7607)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -45,9 +45,11 @@
</span><span class="cx" style="display: block; padding: 0 10px"> // Load the files
</span><span class="cx" style="display: block; padding: 0 10px"> require_once ( WCPT_DIR . 'wcpt-functions.php' );
</span><span class="cx" style="display: block; padding: 0 10px"> require_once ( WCPT_DIR . 'wcpt-wordcamp/wordcamp-loader.php' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- require_once ( WCPT_DIR . 'applications/common.php' );
- require_once ( WCPT_DIR . 'applications/tracker.php' );
- require_once ( WCPT_DIR . 'applications/wordcamp.php' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ require_once ( WCPT_DIR . 'wcpt-meetup/meetup-loader.php' );
+ require_once ( WCPT_DIR . 'wcpt-event/tracker.php' );
+ require_once ( WCPT_DIR . 'wcpt-wordcamp/wordcamp.php' );
+ require_once ( WCPT_DIR . 'wcpt-meetup/meetup.php' );
+ require_once ( WCPT_DIR . 'wcpt-meetup/class-meetup-admin.php' );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><span class="cx" style="display: block; padding: 0 10px"> // Require admin files.
</span><span class="cx" style="display: block; padding: 0 10px"> if ( is_admin() || ( defined( 'DOING_CRON' ) && DOING_CRON ) ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -67,6 +69,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> // Create admin
</span><span class="cx" style="display: block; padding: 0 10px"> $GLOBALS['wcpt_admin'] = new WCPT_Admin;
</span><span class="cx" style="display: block; padding: 0 10px"> $GLOBALS['wordcamp_admin'] = new WordCamp_Admin;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $GLOBALS['meetup_admin'] = new Meetup_Admin();
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -87,3 +90,4 @@
</span><span class="cx" style="display: block; padding: 0 10px"> // Load everything up
</span><span class="cx" style="display: block; padding: 0 10px"> $wcpt_loader = new WCPT_Loader;
</span><span class="cx" style="display: block; padding: 0 10px"> $wordcamp_loader = new WordCamp_Loader;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+$meetup_loader = new Meetup_Loader();
</ins></span></pre></div>
<a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcptmeetupclassmeetupadminphp"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/class-meetup-admin.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/class-meetup-admin.php (rev 0)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/class-meetup-admin.php 2018-08-13 11:52:14 UTC (rev 7607)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,340 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+<?php
+/**
+ * Implement Meetup Admin class
+ *
+ * @package WordCamp Post Type
+ */
+
+use \WordPress_Community\Applications\Meetup_Application;
+
+require_once WCPT_DIR . 'wcpt-event/class-event-admin.php';
+
+if ( ! class_exists( 'MeetupAdmin' ) ) :
+
+ /**
+ * Implements Meetup Admin class
+ */
+ class Meetup_Admin extends Event_Admin {
+
+ /**
+ * Return user facing label of event type.
+ *
+ * @return string
+ */
+ public static function get_event_label() {
+ return Meetup_Application::get_event_label();
+ }
+
+ /**
+ * Get post type of event
+ *
+ * @return string
+ */
+ public static function get_event_type() {
+ return Meetup_Application::get_event_type();
+ }
+
+ /**
+ * TODO: Add valid transition statuses.
+ *
+ * @param string $status Current status of the meetup.
+ *
+ * @return array Valid status transitions.
+ */
+ public static function get_valid_status_transitions( $status ) {
+ return array_keys( Meetup_Application::get_post_statuses() );
+ }
+
+ /**
+ * List of all valid post statuses for Meetup event
+ *
+ * @return array
+ */
+ public static function get_post_statuses() {
+ return Meetup_Application::get_post_statuses();
+ }
+
+ /**
+ * Name of capability required to edit the event
+ *
+ * @return string
+ */
+ public static function get_edit_capability() {
+ return 'can_wrangle_meetup';
+ }
+
+ /**
+ * Columns to display in admin list view
+ *
+ * @param array $columns
+ *
+ * @return array
+ */
+ public function column_headers( $columns ) {
+ $columns = array(
+ 'cb' => '<input type="checkbox" />',
+ 'title' => __( 'Title', 'wcpt' ),
+ 'swag_needed' => __( 'Swag Needed', 'wcpt' ),
+ 'organizer' => __( 'Organizer', 'wcpt' ),
+ 'date' => __( 'Date', 'wcpt' ),
+ 'meetup.com_url' => __( 'Meetup URL', 'wcpt' ),
+ 'helpscout_url' => __( 'HelpScout Link', 'wcpt' ),
+ );
+
+ return $columns;
+ }
+
+ /**
+ * TODO: Implement
+ *
+ * @param string $key Name of the field.
+ *
+ * @return bool Whether `$key` is a protected field.
+ */
+ public static function is_protected_field( $key ) {
+ return false;
+ }
+
+ /**
+ * Get rendered column data.
+ *
+ * @param string $column Name of the column.
+ * @param int $post_id
+ */
+ public function column_data( $column, $post_id ) {
+ if ( empty( $_GET['post_type'] ) || $_GET['post_type'] !== $this->get_event_type() ) {
+ return;
+ }
+
+ switch ( $column ) {
+ case 'organizer':
+ echo esc_html( get_post_meta( $post_id, 'Organizer Name', true ) . '<' . get_post_meta( $post_id, 'Email Address', true ) . '>' );
+ break;
+ case 'meetup.com_url':
+ $this->print_clickable_link( get_post_meta( $post_id, 'Meetup URL', true ) );
+ break;
+ case 'helpscout_url':
+ $this->print_clickable_link( get_post_meta( $post_id, 'HelpScout link', true ) );
+ break;
+ case 'swag_needed':
+ if ( get_post_meta( $post_id, 'Needs swag', true ) ) {
+ echo "<span class='dashicons dashicons-star-filled swag-needed-icon'></span>";
+ }
+ break;
+ }
+ }
+
+ /**
+ * Helper function to wrap link HTML around a url.
+ *
+ * @param string $link
+ */
+ protected function print_clickable_link( $link ) {
+ ?>
+ <a href="<?php echo esc_attr( $link ); ?>" target="_blank">
+ <?php echo esc_html( $link ); ?>
+ </a>
+ <?php
+ }
+
+ /**
+ * TODO: Remove quickedit action.
+ *
+ * @param $actions
+ * @param $post
+ *
+ * @return mixed
+ */
+ public function post_row_actions( $actions, $post ) {
+ return $actions;
+ }
+
+ /**
+ * Add metaboxes for meetup events.
+ */
+ public function metabox() {
+
+ add_meta_box(
+ 'wcpt_meetup_meetup_information',
+ __( 'Meetup Information', 'wcpt' ),
+ array( $this, 'wcpt_meetup_information_metabox' ),
+ Meetup_Application::POST_TYPE,
+ 'advanced'
+ );
+
+ add_meta_box(
+ 'wcpt_meetup_application',
+ __( 'Application Information', 'wcpt' ),
+ array( $this, 'wcpt_application_metabox' ),
+ Meetup_Application::POST_TYPE,
+ 'advanced'
+ );
+
+ add_meta_box(
+ 'wcpt_meetup_organizer_info',
+ __( 'Organizer Information', 'wcpt' ),
+ array( $this, 'wcpt_organizer_info_metabox' ),
+ Meetup_Application::POST_TYPE,
+ 'advanced'
+ );
+
+ add_meta_box(
+ 'wcpt_meetup_swag',
+ __( 'Swag Information', 'wcpt' ),
+ array( $this, 'wcpt_swag_metabox' ),
+ Meetup_Application::POST_TYPE,
+ 'advanced'
+ );
+
+ if ( current_user_can( 'wcpt_wrangle_meetups' ) ) {
+ add_meta_box(
+ 'wcpt_meetup_notes',
+ __( 'Add Private Note', 'wcpt' ),
+ array( $this, 'wcpt_notes_metabox' ),
+ Meetup_Application::POST_TYPE,
+ 'advanced'
+ );
+
+ add_meta_box(
+ 'wcpt_meetup_logs',
+ __( 'Logs', 'wcpt' ),
+ array( $this, 'wcpt_logs_metabox' ),
+ Meetup_Application::POST_TYPE,
+ 'advanced'
+ );
+
+ }
+ }
+
+ /**
+ * Render information metabox group.
+ */
+ public function wcpt_meetup_information_metabox() {
+ $meta_keys = $this->meta_keys( 'information' );
+ $this->meetup_metabox( $meta_keys );
+ }
+
+ /**
+ * Render application metabox group.
+ */
+ public function wcpt_application_metabox() {
+ $meta_keys = $this->meta_keys( 'application' );
+ $this->meetup_metabox( $meta_keys );
+ }
+
+ /**
+ * Render organizer metabox group.
+ */
+ public function wcpt_organizer_info_metabox() {
+ $meta_keys = $this->meta_keys( 'organizer' );
+ $this->meetup_metabox( $meta_keys );
+ }
+
+ /**
+ * Render swag metabox group.
+ */
+ public function wcpt_swag_metabox() {
+ $meta_keys = $this->meta_keys( 'swag' );
+ $this->meetup_metabox( $meta_keys );
+ }
+
+ /**
+ * Render notes metabox group.
+ */
+ public function wcpt_notes_metabox() {
+ $meta_keys = $this->meta_keys( 'notes' );
+ $this->meetup_metabox( $meta_keys );
+ }
+
+ /**
+ * Render logs metabox groups.
+ */
+ public function wcpt_logs_metabox() {
+ $meta_keys = $this->meta_keys( 'logs' );
+ $this->meetup_metabox( $meta_keys );
+ }
+
+ /**
+ * Display metaboxes for the keys provided in the argument.
+ *
+ * @param array $meta_keys
+ */
+ public function meetup_metabox( $meta_keys ) {
+ global $post_id;
+
+ self::display_meta_boxes( array(), $meta_keys, array(), $post_id, array() );
+ }
+
+ /**
+ * Meta keys group for Meetup Event.
+ *
+ * @param string $meta_group
+ *
+ * @return array
+ */
+ public static function meta_keys( $meta_group = '' ) {
+
+ $info_keys = array(
+ 'Meetup URL' => 'text',
+ 'HelpScout link' => 'text',
+ 'City' => 'text',
+ 'State' => 'text',
+ 'Country' => 'text',
+ 'Zip' => 'text',
+ );
+
+ $application_keys = array(
+ 'Date Applied' => 'date',
+ 'Date of Last Contact' => 'date',
+ 'Who contacted' => 'text',
+ 'Vetted Date' => 'date',
+ 'Vetted by' => 'text',
+ 'Orientation Date' => 'date',
+ 'Oriented by' => 'text',
+ 'Joined chapter date' => 'date',
+ 'Joined chapter by' => 'text',
+ );
+
+ $organizer_keys = array(
+ 'Organizer Name' => 'text',
+ 'Email' => 'text',
+ 'Primary organizer WordPress.org username' => 'text',
+ 'Co-Organizers usernames (seperated by comma)' => 'text',
+ 'Date closed' => 'date',
+ 'Skype/Slack' => 'text',
+ 'Region' => 'text',
+ 'Address' => 'textarea',
+ );
+
+ $swag_keys = array(
+ 'Needs swag' => 'checkbox',
+ 'Swag notes' => 'text',
+ );
+
+ switch ( $meta_group ) {
+ case 'information':
+ $data = $info_keys;
+ break;
+ case 'application':
+ $data = $application_keys;
+ break;
+ case 'organizer':
+ $data = $organizer_keys;
+ break;
+ case 'swag':
+ $data = $swag_keys;
+ break;
+ case 'all':
+ default:
+ $data = array_merge(
+ $info_keys,
+ $application_keys,
+ $organizer_keys,
+ $swag_keys
+ );
+ }
+ return $data;
+ }
+ }
+
+endif;
</ins><span class="cx" style="display: block; padding: 0 10px">Property changes on: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/class-meetup-admin.php
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:eol-style</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+native
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcptmeetupclassmeetupapplicationphp"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/class-meetup-application.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/class-meetup-application.php (rev 0)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/class-meetup-application.php 2018-08-13 11:52:14 UTC (rev 7607)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,277 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+<?php
+/**
+ * Implements meetup application class
+ *
+ * @package WordCamp Post Type
+ */
+
+namespace WordPress_Community\Applications;
+use function WordPress_Community\Applications\Meetup\render_meetup_application_form;
+
+require_once dirname( __DIR__ ) . '/wcpt-event/class-event-application.php';
+
+/**
+ * Class Meetup_Application
+ *
+ * @package WordPress_Community\Applications
+ */
+class Meetup_Application extends Event_Application {
+
+ /**
+ * Used to maintain state across functions. Set in create_post function.
+ *
+ * @var \WP_Post
+ */
+ public $post;
+
+ const SHORTCODE_SLUG = 'meetup-organizer-application';
+
+ const POST_TYPE = 'wp_meetup';
+
+ /**
+ * User facing string of event type.
+ *
+ * @return string
+ */
+ public static function get_event_label() {
+ return __( 'Meetup', 'wordcamporg' );
+ }
+
+ /**
+ * Get the post type.
+ *
+ * @return string
+ */
+ public static function get_event_type() {
+ return self::POST_TYPE;
+ }
+
+ /**
+ * Get MeetUp post statuses
+ *
+ * @return array
+ */
+ public static function get_post_statuses() {
+ return array(
+ 'wcpt-mtp-nds-vet' => _x( 'Needs Vetting', 'Meetup status', 'wordcamporg' ),
+ 'wcpt-mtp-more-info' => _x( 'More Info Requested', 'Meetup status', 'wordcamporg' ),
+ 'wcpt-mtp-nds-ori' => _x( 'Needs Orientation/Interview', 'Meetup status', 'wordcamporg' ),
+ 'wcpt-mtp-nds-sit' => _x( 'Needs Site', 'Meetup status', 'wordcamporg' ),
+ 'wcpt-mtp-nds-trn' => _x( 'Needs Transfer', 'Meetup status', 'wordcamporg' ),
+ 'wcpt-mtp-nds-nw-ow' => _x( 'Needs to assign new owner', 'Meetup status', 'wordcamporg' ),
+ 'wcpt-mtp-chng-req' => _x( 'Changes requested', 'Meetup status', 'wordcamporg' ),
+ 'wcpt-mtp-nds-swag' => _x( 'Needs Swag', 'Meetup status', 'wordcamporg' ),
+ 'wcpt-mtp-rejected' => _x( 'Declined', 'Meetup status', 'wordcamporg' ),
+ 'wcpt-mtp-active' => _x( 'Active', 'Meetup status', 'wordcamporg' ),
+ 'wcpt-mtp-dormant' => _x( 'Dormant', 'Meetup status', 'wordcamporg' ),
+ 'wcpt-mtp-removed' => _x( 'Removed', 'Meetup status', 'wordcamporg' ),
+ );
+ }
+
+ /**
+ * Public statuses for meetup. Meetup having these statuses will be rendered in the tracking widget.
+ *
+ * @return array
+ */
+ public static function get_public_post_statuses() {
+ return array( 'wcpt-mtp-nds-swag', 'wcpt-mtp-active', 'wcpt-mtp-dormant' );
+ }
+
+ /**
+ * Enqueue scripts and stylesheets.
+ */
+ function enqueue_assets() {
+ global $post;
+
+ wp_register_script(
+ 'meetup-application',
+ plugins_url( 'javascript/applications/meetup.js', __DIR__ ), // todo won't need this?
+ array( 'jquery' ),
+ 1,
+ true
+ );
+
+ wp_register_style(
+ 'meetup-application',
+ plugins_url( 'css/applications/meetup.css', __DIR__ ), // todo need this?
+ array( 'wp-community-applications' ),
+ 1
+ );
+
+ if ( isset( $post->post_content ) && has_shortcode( $post->post_content, self::SHORTCODE_SLUG ) ) {
+ wp_enqueue_script( 'meetup-application' );
+ wp_enqueue_style( 'meetup-application' );
+ }
+ }
+
+ /**
+ * Render application form
+ *
+ * @param array $countries
+ *
+ * @return null|void
+ */
+ public function render_application_form( $countries ) {
+ require_once dirname( __DIR__ ) . '/views/applications/meetup/shortcode-application.php';
+ render_meetup_application_form( $countries );
+ }
+
+ /**
+ * Validate the submitted application data
+ *
+ * @param array $unsafe_data
+ *
+ * @return array|\WP_Error
+ */
+ public function validate_data( $unsafe_data ) {
+ $safe_data = array();
+ $unsafe_data = shortcode_atts( $this->get_default_application_values(), $unsafe_data );
+
+ $required_fields = array(
+ 'q_first_name',
+ 'q_last_name',
+ 'q_email',
+ 'q_city',
+ 'q_state',
+ 'q_country',
+ 'q_zip',
+ 'q_already_a_meetup',
+ 'q_describe_yourself',
+ 'q_wporg_username',
+ );
+
+ foreach ( $unsafe_data as $key => $value ) {
+ if ( is_array( $value ) ) {
+ $safe_data[ $key ] = array_map( 'sanitize_text_field', $value );
+ } else {
+ $safe_data[ $key ] = sanitize_text_field( $value );
+ }
+ }
+
+ foreach ( $required_fields as $field ) {
+ if ( empty( $safe_data[ $field ] ) ) {
+ return new \WP_Error( 'required_fields', "Please click on your browser's Back button, and fill in all of the required fields." );
+ }
+ }
+
+ return $safe_data;
+ }
+
+ /**
+ * Get the default values for all application fields
+ *
+ * @return array
+ */
+ public function get_default_application_values() {
+ // WordCamp uses an ID with questions. Not sure how are they used. Ask @corey
+ $values = array(
+ 'q_first_name' => '',
+ 'q_last_name' => '',
+ 'q_email' => '',
+ 'q_city' => '',
+ 'q_state' => '',
+ 'q_country' => '',
+ 'q_zip' => '',
+ 'q_already_a_meetup' => '',
+ 'q_existing_meetup_url' => '',
+ 'q_describe_yourself' => '',
+ 'q_wporg_username' => '',
+ 'q_wp_slack_username' => '',
+ );
+
+ return $values;
+ }
+
+ /**
+ * Create a meetup post from an application
+ *
+ * @param array $data
+ *
+ * @return bool|\WP_Error
+ */
+ public function create_post( $data ) {
+ // Create the post.
+ $user = wcorg_get_user_by_canonical_names( $data['q_wporg_username'] );
+ $statuses = self::get_post_statuses();
+
+ $post = array(
+ 'post_type' => self::get_event_type(),
+ 'post_title' => $data['q_city'] . ', ' . $data['q_country'],
+ 'post_status' => self::get_default_status(),
+ 'post_author' => is_a( $user, 'WP_User' ) ? $user->ID : 0,
+ );
+
+ $post_id = wp_insert_post( $post, true );
+
+ if ( is_wp_error( $post_id ) ) {
+ return $post_id;
+ }
+
+ // Populate the meta fields.
+ add_post_meta( $post_id, '_application_data', $data );
+
+ add_post_meta(
+ $post_id, 'Organizer Name', sprintf(
+ '%s %s',
+ $data['q_first_name'],
+ $data['q_last_name']
+ )
+ );
+
+ add_post_meta( $post_id, 'Email Address', $data['q_email'] );
+ add_post_meta( $post_id, 'City', $data['q_city'] );
+ add_post_meta( $post_id, 'State', $data['q_state'] );
+ add_post_meta( $post_id, 'Country', $data['q_country'] );
+ add_post_meta( $post_id, 'Zip', $data['q_zip'] );
+ add_post_meta( $post_id, 'Already a meetup', $data['q_already_a_meetup'] );
+ add_post_meta( $post_id, 'Existing meetup URL', $data['q_existing_meetup_url'] );
+ add_post_meta( $post_id, 'Best describe organizer', $data['q_describe_yourself'] );
+ add_post_meta( $post_id, 'WordPress.org username', $data['q_wporg_username'] );
+ add_post_meta( $post_id, 'WordPress slack username', $data['q_wp_slack_username'] );
+ add_post_meta( $post_id, 'Date Applied', gmdate( 'Y-m-d\TH:i:s\Z' ) );
+
+ add_post_meta(
+ $post_id, '_status_change', array(
+ 'timestamp' => time(),
+ 'user_id' => is_a( $user, 'WP_User' ) ? $user->ID : 0,
+ 'message' => sprintf( '%s → %s', 'Application', $statuses[ self::get_default_status() ] ),
+ )
+ );
+
+ $this->post = get_post( $post_id );
+
+ return true;
+ }
+
+ /**
+ * Get the default status.
+ *
+ * @return string
+ */
+ public static function get_default_status() {
+ return 'wcpt-mtp-nds-vet';
+ }
+
+ /**
+ * Get organizer email if set
+ *
+ * @return null|string
+ */
+ public function get_organizer_email() {
+ if ( isset( $this->post ) && isset( $this->post->ID ) ) {
+ return get_post_meta( $this->post->ID, 'q_email' );
+ }
+ }
+
+ /**
+ * Get meetup location if set
+ *
+ * @return null|string
+ */
+ public function get_event_location() {
+ if ( isset( $this->post ) && isset( $this->post->ID ) ) {
+ return get_post_meta( $this->post->ID, 'q_city' );
+ }
+ }
+
+}
</ins><span class="cx" style="display: block; padding: 0 10px">Property changes on: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/class-meetup-application.php
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:eol-style</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+native
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcptmeetupmeetuploaderphp"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/meetup-loader.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/meetup-loader.php (rev 0)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/meetup-loader.php 2018-08-13 11:52:14 UTC (rev 7607)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,120 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+<?php
+/**
+ * Implements Meetup_Loader
+ *
+ * @package WordCamp Post Type
+ */
+
+use WordPress_Community\Applications\Meetup_Application;
+define( 'WCPT_MEETUP_SLUG', 'wp_meetup' );
+
+
+if ( ! class_exists( 'Meetup_Loader' ) ) :
+
+ /**
+ * Class Meetup_Loader
+ */
+ class Meetup_Loader extends Event_Loader {
+
+
+ /**
+ * Include files specific for meetup event
+ */
+ public function includes() {
+ }
+
+ /**
+ * Register meetup custom post type
+ */
+ public function register_post_types() {
+ // Meetup post type labels
+ $wcpt_labels = array(
+ 'name' => __( 'Meetups', 'wordcamporg' ),
+ 'singular_name' => __( 'Meetup', 'wordcamporg' ),
+ 'add_new' => __( 'Add New', 'wordcamporg' ),
+ 'add_new_item' => __( 'Create New Meetup', 'wordcamporg' ),
+ 'edit' => __( 'Edit', 'wordcamporg' ),
+ 'edit_item' => __( 'Edit Meetup', 'wordcamporg' ),
+ 'new_item' => __( 'New Meetup', 'wordcamporg' ),
+ 'view' => __( 'View Meetup', 'wordcamporg' ),
+ 'view_item' => __( 'View Meetup', 'wordcamporg' ),
+ 'search_items' => __( 'Search Meetup', 'wordcamporg' ),
+ 'not_found' => __( 'No Meetup found', 'wordcamporg' ),
+ 'not_found_in_trash' => __( 'No Meetup found in Trash', 'wordcamporg' ),
+ 'parent_item_colon' => __( 'Parent Meetup:', 'wordcamporg' ),
+ );
+
+ // Meetup post type rewrite
+ // TODO: Is this necessary?
+ $wcpt_rewrite = array(
+ 'slug' => WCPT_MEETUP_SLUG,
+ 'with_front' => false,
+ );
+
+ $wcpt_supports = array(
+ 'title',
+ 'editor',
+ 'thumbnail',
+ 'revisions',
+ 'author',
+ );
+
+ // Register WordCamp post type
+ register_post_type(
+ Meetup_Application::POST_TYPE, array(
+ 'labels' => $wcpt_labels,
+ 'rewrite' => $wcpt_rewrite,
+ 'supports' => $wcpt_supports,
+ 'menu_position' => '100',
+ 'public' => true,
+ 'show_ui' => true,
+ 'can_export' => true,
+ 'capability_type' => Meetup_Application::POST_TYPE,
+ 'map_meta_cap' => true,
+ 'hierarchical' => false,
+ 'has_archive' => true,
+ 'query_var' => true,
+ 'menu_icon' => 'dashicons-wordpress',
+ 'show_in_rest' => true,
+ 'rest_base' => 'meetups',
+ )
+ );
+ }
+
+ /**
+ * Allow some site roles to see WordCamp posts.
+ */
+ public function register_post_capabilities() {
+ $roles = array(
+ 'contributor',
+ 'author',
+ 'editor',
+ 'administrator',
+ );
+
+ foreach ( $roles as $role ) {
+ get_role( $role )->add_cap( 'edit_' . Meetup_Application::POST_TYPE . 's' );
+ }
+ }
+
+ /**
+ * Get available post statuses
+ *
+ * @return array
+ */
+ public static function get_post_statuses() {
+ return Meetup_Application::get_post_statuses();
+ }
+
+ /**
+ * Get public post statuses
+ *
+ * @return array
+ */
+ public static function get_public_post_statuses() {
+ return Meetup_Application::get_public_post_statuses();
+ }
+
+ }
+
+endif;
</ins><span class="cx" style="display: block; padding: 0 10px">Property changes on: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/meetup-loader.php
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:eol-style</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+native
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcptmeetupmeetupphp"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/meetup.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/meetup.php (rev 0)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/meetup.php 2018-08-13 11:52:14 UTC (rev 7607)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,21 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+<?php
+
+namespace WordPress_Community\Applications\Meetup;
+
+require_once 'class-meetup-application.php';
+use WordPress_Community\Applications\Meetup_Application;
+
+defined( 'WPINC' ) or die();
+
+/*
+ * todo
+ * grant access to regular deputies to vet meetups
+ * also do that for wordcamps, so prob use same system
+ maybe just create array for regular deupties like the ones we have for super deputies , but it doesn't requier proxy access?
+ */
+
+$meetup_application = new Meetup_Application();
+
+add_shortcode( $meetup_application::SHORTCODE_SLUG, array( $meetup_application, 'render_application_shortcode' ) );
+
+add_action( 'wp_enqueue_scripts', array( $meetup_application, 'enqueue_assets' ), 11 );
</ins><span class="cx" style="display: block; padding: 0 10px">Property changes on: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/meetup.php
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:eol-style</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+native
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcptwordcampclasswordcampapplicationphp"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-wordcamp/class-wordcamp-application.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-wordcamp/class-wordcamp-application.php (rev 0)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-wordcamp/class-wordcamp-application.php 2018-08-13 11:52:14 UTC (rev 7607)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,256 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+<?php
+
+namespace WordPress_Community\Applications;
+
+use function WordPress_Community\Applications\WordCamp\render_wordcamp_application_form;
+
+require_once dirname( __DIR__ ) . '/wcpt-event/class-event-application.php';
+require_once dirname( __DIR__ ) . '/views/applications/wordcamp/shortcode-application.php';
+
+class WordCamp_Application extends Event_Application {
+
+ public $post;
+
+ const SHORTCODE_SLUG = 'wordcamp-organizer-application';
+
+ static function get_event_label() {
+ __( 'WordCamp', 'wordcamporg' );
+ }
+
+ /**
+ * Gets the post type
+ *
+ * @return string
+ */
+ static function get_event_type() {
+ return WCPT_POST_TYPE_ID;
+ }
+
+ /**
+ * Enqueue scripts and stylesheets
+ */
+ function enqueue_assets() {
+ global $post;
+
+ wp_register_script(
+ 'wordcamp-application',
+ plugins_url( 'javascript/applications/wordcamp.js', __DIR__ ),
+ array( 'jquery' ),
+ 1,
+ true
+ );
+
+ wp_register_style(
+ 'wordcamp-application',
+ plugins_url( 'css/applications/wordcamp.css', __DIR__ ),
+ array( 'wp-community-applications' ),
+ 1
+ );
+
+ if ( isset( $post->post_content ) && has_shortcode( $post->post_content, self::SHORTCODE_SLUG ) ) {
+ wp_enqueue_script( 'wordcamp-application' );
+ wp_enqueue_style( 'wordcamp-application' );
+ }
+ }
+
+ /**
+ * Render application form
+ *
+ * @param array $countries
+ *
+ * @return null|void
+ */
+ function render_application_form( $countries ) {
+ render_wordcamp_application_form( $countries );
+ }
+
+ /**
+ * Validate the submitted application data
+ *
+ * @param array $unsafe_data
+ *
+ * @return array|\WP_Error
+ */
+ function validate_data( $unsafe_data ) {
+ $safe_data = array();
+ $unsafe_data = shortcode_atts( $this->get_default_application_values(), $unsafe_data );
+
+ $required_fields = array(
+ 'q_1079074_first_name',
+ 'q_1079074_last_name',
+ 'q_1079059_email',
+ 'q_4236565_wporg_username',
+ 'q_1079103_wordcamp_location',
+ );
+
+ foreach ( $unsafe_data as $key => $value ) {
+ if ( is_array( $value ) ) {
+ $safe_data[ $key ] = array_map( 'sanitize_text_field', $value );
+ } else {
+ $safe_data[ $key ] = sanitize_text_field( $value );
+ }
+ }
+
+ foreach ( $required_fields as $field ) {
+ if ( empty( $safe_data[ $field ] ) ) {
+ return new \WP_Error( 'required_fields', "Please click on your browser's Back button, and fill in all of the required fields." );
+ }
+ }
+
+ return $safe_data;
+ }
+
+ /**
+ * Get the default values for all application fields
+ *
+ * @return array
+ */
+ function get_default_application_values() {
+ $values = array(
+ // Part 1
+ 'q_1079074_first_name' => '',
+ 'q_1079074_last_name' => '',
+ 'q_1079059_email' => '',
+ 'q_1079060_add1' => '',
+ 'q_1079060_add2' => '',
+ 'q_1079060_city' => '',
+ 'q_1079060_state' => '',
+ 'q_1079060_zip' => '',
+ 'q_1079060_country' => '',
+ 'q_1045947_years_using_wp' => '',
+ 'q_1068246_ways_involved' => array(),
+ 'q_1068246_ways_involved_other' => '',
+ 'q_1046032_attended_camp_before' => '',
+ 'q_1046033_camps_been_to' => '',
+ 'q_1068223_hope_to_accomplish' => array(),
+ 'q_1068223_hope_to_accomplish_other' => '',
+
+ // Part 2
+ 'q_1045950_active_meetup' => '',
+ 'q_1045953_role_in_meetup' => '',
+ 'q_1045972_meetup_url' => '',
+ 'q_1045967_meetup_members' => '',
+ 'q_1045956_how_often_meetup' => '',
+ 'q_1045971_how_many_attend' => '',
+ 'q_1079086_other_tech_events' => '',
+ 'q_1079082_other_tech_events_success' => '',
+
+ // Part 3
+ 'q_1079103_wordcamp_location' => '',
+ 'q_1046006_wordcamp_date' => '',
+ 'q_1046007_how_many_attendees' => '',
+ 'q_1046038_organized_event_before' => '',
+ 'q_1046099_describe_events' => '',
+ 'q_1046101_have_co_organizers' => '',
+ 'q_1068188_relationship_co_organizers' => array(),
+ 'q_1068188_relationship_co_organizers_other' => '',
+ 'q_1068187_co_organizer_contact_info' => '',
+ 'q_1068214_raise_money' => '',
+ 'q_1068220_interested_sponsors' => '',
+ 'q_1046009_good_presenters' => '',
+ 'q_1046021_presenter_names' => '',
+ 'q_1068197_venue_connections' => '',
+ 'q_1068212_venues_considering' => '',
+ 'q_4236565_wporg_username' => '',
+ 'q_4236565_slack_username' => '',
+ 'where_find_online' => '',
+ 'q_1079098_anything_else' => '',
+
+ // Bonus
+ 'q_1079112_best_describes_you' => '',
+ 'q_1079112_best_describes_you_other' => '',
+ );
+
+ return $values;
+ }
+
+ /**
+ * Create a WordCamp post from an application
+ *
+ * @param array $data
+ *
+ * @return bool|\WP_Error
+ */
+ function create_post( $data ) {
+ // Create the post
+ $user = wcorg_get_user_by_canonical_names( $data['q_4236565_wporg_username'] );
+ $statues = \WordCamp_Loader::get_post_statuses();
+ $countries = wcorg_get_countries();
+
+ $post = array(
+ 'post_type' => $this->get_event_type(),
+ 'post_title' => 'WordCamp ' . $data['q_1079103_wordcamp_location'],
+ 'post_status' => WCPT_DEFAULT_STATUS,
+ 'post_author' => is_a( $user, 'WP_User' ) ? $user->ID : 7694169, // Set `wordcamp` as author if supplied username is not valid
+ );
+
+ $post_id = wp_insert_post( $post, true );
+
+ if ( is_wp_error( $post_id ) ) {
+ return $post_id;
+ }
+
+ // Populate the meta fields
+ add_post_meta( $post_id, '_application_data', $data );
+ add_post_meta( $post_id, '_application_submitter_ip_address', $_SERVER['REMOTE_ADDR'] );
+
+ add_post_meta(
+ $post_id, 'Organizer Name', sprintf(
+ '%s %s',
+ $data['q_1079074_first_name'],
+ $data['q_1079074_last_name']
+ )
+ );
+
+ add_post_meta( $post_id, 'Email Address', $data['q_1079059_email'] );
+ add_post_meta( $post_id, 'Location', $data['q_1079103_wordcamp_location'] );
+ add_post_meta( $post_id, 'Number of Anticipated Attendees', $data['q_1046007_how_many_attendees'] );
+ add_post_meta( $post_id, 'WordPress.org Username', $data['q_4236565_wporg_username'] );
+
+ add_post_meta(
+ $post_id, 'Mailing Address', sprintf(
+ "%s\n%s%s%s %s\n%s",
+ $data['q_1079060_add1'],
+ $data['q_1079060_add2'] ? $data['q_1079060_add2'] . "\n" : '',
+ $data['q_1079060_city'] ? $data['q_1079060_city'] . ', ' : '',
+ $data['q_1079060_state'],
+ $data['q_1079060_zip'],
+ $data['q_1079060_country'] ? $countries[ $data['q_1079060_country'] ]['name'] : ''
+ )
+ );
+
+ add_post_meta(
+ $post_id, '_status_change', array(
+ 'timestamp' => time(),
+ 'user_id' => is_a( $user, 'WP_User' ) ? $user->ID : 0,
+ 'message' => sprintf( '%s → %s', 'Application', $statues[ WCPT_DEFAULT_STATUS ] ),
+ )
+ );
+
+ $this->post = get_post( $post_id );
+ return true;
+ }
+
+ /**
+ * Get organizer email if set
+ *
+ * @return null|string
+ */
+ function get_organizer_email() {
+ if ( isset( $this->post ) && isset( $this->post->ID ) ) {
+ return get_post_meta( $this->post->ID, 'q_1079059_email' );
+ }
+ }
+
+ /**
+ * Get meetup location if set
+ *
+ * @return null|string
+ */
+ function get_event_location() {
+ if ( isset( $this->post ) && isset( $this->post->ID ) ) {
+ return get_post_meta( $this->post->ID, 'q_1079103_wordcamp_location' );
+ }
+ }
+
+}
</ins><span class="cx" style="display: block; padding: 0 10px">Property changes on: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-wordcamp/class-wordcamp-application.php
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:eol-style</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+native
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcptwordcampwordcampadminphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-wordcamp/wordcamp-admin.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-wordcamp/wordcamp-admin.php 2018-08-13 07:28:19 UTC (rev 7606)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-wordcamp/wordcamp-admin.php 2018-08-13 11:52:14 UTC (rev 7607)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1,649 +1,523 @@
</span><span class="cx" style="display: block; padding: 0 10px"> <?php
</span><span class="cx" style="display: block; padding: 0 10px">
</span><span class="cx" style="display: block; padding: 0 10px"> use WordCamp\Mentors_Dashboard;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+use WordPress_Community\Applications\WordCamp_Application;
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+require_once WCPT_DIR . 'wcpt-event/class-event-admin.php';
+
</ins><span class="cx" style="display: block; padding: 0 10px"> if ( ! class_exists( 'WordCamp_Admin' ) ) :
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-/**
- * WCPT_Admin
- *
- * Loads plugin admin area
- *
- * @package WordCamp Post Type
- * @subpackage Admin
- * @since WordCamp Post Type (0.1)
- */
-class WordCamp_Admin {
- protected $active_admin_notices;
-
</del><span class="cx" style="display: block; padding: 0 10px"> /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * Initialize WCPT Admin
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * WCPT_Admin
+ *
+ * Loads plugin admin area
+ *
+ * @package WordCamp Post Type
+ * @subpackage Admin
+ * @since WordCamp Post Type (0.1)
</ins><span class="cx" style="display: block; padding: 0 10px"> */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- function __construct() {
- $this->active_admin_notices = array();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ class WordCamp_Admin extends Event_Admin {
+ protected $active_admin_notices;
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Add some general styling to the admin area
- add_action( 'wcpt_admin_head', array( $this, 'admin_head' ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * Initialize WCPT Admin
+ */
+ function __construct() {
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Forum column headers.
- add_filter( 'manage_' . WCPT_POST_TYPE_ID . '_posts_columns', array( $this, 'column_headers' ) );
- add_filter( 'display_post_states', array( $this, 'display_post_states' ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ parent::__construct();
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Forum columns (in page row)
- add_action( 'manage_posts_custom_column', array( $this, 'column_data' ), 10, 2 );
- add_filter( 'post_row_actions', array( $this, 'post_row_actions' ), 10, 2 );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $this->active_admin_notices = array();
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Topic metabox actions
- add_action( 'add_meta_boxes', array( $this, 'metabox' ) );
- add_action( 'save_post_' . WCPT_POST_TYPE_ID, array( $this, 'metabox_save' ), 10, 2 );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Add some general styling to the admin area
+ add_action( 'wcpt_admin_head', array( $this, 'admin_head' ) );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Scripts and CSS
- add_action( 'admin_enqueue_scripts', array( $this, 'admin_scripts' ) );
- add_action( 'admin_print_styles', array( $this, 'admin_styles' ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Scripts and CSS
+ add_action( 'admin_enqueue_scripts', array( $this, 'admin_scripts' ) );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Post status transitions
- add_action( 'transition_post_status', array( $this, 'trigger_schedule_actions' ), 10, 3 );
- add_action( 'transition_post_status', array( $this, 'log_status_changes' ), 10, 3 );
- add_action( 'wcpt_approved_for_pre_planning', array( $this, 'add_organizer_to_central' ), 10 );
- add_action( 'wcpt_approved_for_pre_planning', array( $this, 'mark_date_added_to_planning_schedule' ), 10 );
- add_filter( 'wp_insert_post_data', array( $this, 'enforce_post_status' ), 10, 2 );
- add_filter( 'wp_insert_post_data', array( $this, 'require_complete_meta_to_publish_wordcamp' ), 11, 2 ); // after enforce_post_status
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Post status transitions
+ add_action( 'transition_post_status', array( $this, 'trigger_schedule_actions' ), 10, 3 );
+ add_action( 'wcpt_approved_for_pre_planning', array( $this, 'add_organizer_to_central' ), 10 );
+ add_action( 'wcpt_approved_for_pre_planning', array( $this, 'mark_date_added_to_planning_schedule' ), 10 );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Admin notices
- add_action( 'admin_notices', array( $this, 'print_admin_notices' ) );
- add_filter( 'redirect_post_location', array( $this, 'add_admin_notices_to_redirect_url' ), 10, 2 );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ add_filter( 'wp_insert_post_data', array( $this, 'enforce_post_status' ), 10, 2 );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Cron jobs
- add_action( 'plugins_loaded', array( $this, 'schedule_cron_jobs' ), 11 );
- add_action( 'wcpt_close_wordcamps_after_event', array( $this, 'close_wordcamps_after_event' ) );
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ add_filter(
+ 'wp_insert_post_data', array(
+ $this,
+ 'require_complete_meta_to_publish_wordcamp',
+ ), 11, 2
+ ); // after enforce_post_status
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * metabox ()
- *
- * Add the metabox
- *
- * @uses add_meta_box
- */
- function metabox() {
- add_meta_box(
- 'wcpt_information',
- __( 'WordCamp Information', 'wcpt' ),
- 'wcpt_wordcamp_metabox',
- WCPT_POST_TYPE_ID,
- 'advanced',
- 'high'
- );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Admin notices
+ add_action( 'admin_notices', array( $this, 'print_admin_notices' ) );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- add_meta_box(
- 'wcpt_organizer_info',
- __( 'Organizing Team', 'wcpt' ),
- 'wcpt_organizer_metabox',
- WCPT_POST_TYPE_ID,
- 'advanced',
- 'high'
- );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ add_filter( 'redirect_post_location', array( $this, 'add_admin_notices_to_redirect_url' ), 10, 2 );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- add_meta_box(
- 'wcpt_venue_info',
- __( 'Venue Information', 'wcpt' ),
- 'wcpt_venue_metabox',
- WCPT_POST_TYPE_ID,
- 'advanced',
- 'high'
- );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Cron jobs
+ add_action( 'plugins_loaded', array( $this, 'schedule_cron_jobs' ), 11 );
+ add_action( 'wcpt_close_wordcamps_after_event', array( $this, 'close_wordcamps_after_event' ) );
+ add_action( 'wcpt_metabox_save_done', array( $this, 'update_venue_address' ) );
+ add_action( 'wcpt_metabox_save_done', array( $this, 'update_mentor' ) );
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- add_meta_box(
- 'wcpt_contributor_info',
- __( 'Contributor Day Information', 'wcpt' ),
- 'wcpt_contributor_metabox',
- WCPT_POST_TYPE_ID,
- 'advanced'
- );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * metabox ()
+ *
+ * Add the metabox
+ *
+ * @uses add_meta_box
+ */
+ function metabox() {
+ add_meta_box(
+ 'wcpt_information',
+ __( 'WordCamp Information', 'wcpt' ),
+ 'wcpt_wordcamp_metabox',
+ WCPT_POST_TYPE_ID,
+ 'advanced',
+ 'high'
+ );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- add_meta_box(
- 'wcpt_original_application',
- 'Original Application',
- array( $this, 'original_application_metabox' ),
- WCPT_POST_TYPE_ID,
- 'advanced',
- 'low'
- );
-
- // Notes are private, so only show them to WordCamp Wranglers
- if ( current_user_can( 'wordcamp_wrangle_wordcamps' ) ) {
</del><span class="cx" style="display: block; padding: 0 10px"> add_meta_box(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- 'wcpt_notes',
- __( 'Add Private Note', 'wordcamporg' ),
- 'wcpt_add_note_metabox',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ 'wcpt_organizer_info',
+ __( 'Organizing Team', 'wcpt' ),
+ 'wcpt_organizer_metabox',
</ins><span class="cx" style="display: block; padding: 0 10px"> WCPT_POST_TYPE_ID,
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- 'side',
- 'low'
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ 'advanced',
+ 'high'
</ins><span class="cx" style="display: block; padding: 0 10px"> );
</span><span class="cx" style="display: block; padding: 0 10px">
</span><span class="cx" style="display: block; padding: 0 10px"> add_meta_box(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- 'wcpt_log',
- 'Log',
- 'wcpt_log_metabox',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ 'wcpt_venue_info',
+ __( 'Venue Information', 'wcpt' ),
+ 'wcpt_venue_metabox',
</ins><span class="cx" style="display: block; padding: 0 10px"> WCPT_POST_TYPE_ID,
</span><span class="cx" style="display: block; padding: 0 10px"> 'advanced',
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- 'low'
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ 'high'
</ins><span class="cx" style="display: block; padding: 0 10px"> );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- }
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Remove core's submitdiv.
- remove_meta_box( 'submitdiv', WCPT_POST_TYPE_ID, 'side' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ add_meta_box(
+ 'wcpt_contributor_info',
+ __( 'Contributor Day Information', 'wcpt' ),
+ 'wcpt_contributor_metabox',
+ WCPT_POST_TYPE_ID,
+ 'advanced'
+ );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- $statuses = WordCamp_Loader::get_post_statuses();
-
- add_meta_box(
- 'submitdiv',
- __( 'Status', 'wordcamporg' ),
- array( $this, 'metabox_status' ),
- WCPT_POST_TYPE_ID,
- 'side',
- 'high'
- );
- }
-
- /**
- * metabox_save ()
- *
- * Pass the metabox values before saving
- *
- * @param int $post_id
- * @return int
- */
- function metabox_save( $post_id, $post ) {
- // Don't add/remove meta on revisions and auto-saves
- if ( wp_is_post_autosave( $post_id ) || wp_is_post_revision( $post_id ) )
- return;
-
- // Don't add/remove meta on trash, untrash, restore, etc
- if ( empty( $_POST['action'] ) || 'editpost' != $_POST['action'] ) {
- return;
</del><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // WordCamp post type only
- if ( WCPT_POST_TYPE_ID != get_post_type() ) {
- return;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * Get label for event type
+ *
+ * @return string
+ */
+ static function get_event_label() {
+ return WordCamp_Application::get_event_label();
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Make sure the requset came from the edit post screen.
- if ( empty( $_POST['_wpnonce'] ) || ! wp_verify_nonce( $_POST['_wpnonce'], 'update-post_' . $post_id ) ) {
- return;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * Get wordcamp post type
+ *
+ * @return string
+ */
+ static function get_event_type() {
+ return WordCamp_Application::get_event_type();
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // If the venue address was changed, update its coordinates
- $new_address = $_POST[ wcpt_key_to_str( 'Physical Address', 'wcpt_' ) ];
- if ( $new_address != get_post_meta( $post_id, 'Physical Address', true ) ) {
- $this->update_venue_address( $post_id, $new_address );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * Check if a field is readonly.
+ *
+ * @param $key
+ *
+ * @return bool
+ */
+ function _is_protected_field( $key ) {
+ return self::is_protected_field( $key );
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // If the Mentor username changed, update the site
- $mentor_username = $_POST[ wcpt_key_to_str( 'Mentor WordPress.org User Name', 'wcpt_' ) ];
- if ( $mentor_username !== get_post_meta( $post_id, 'Mentor WordPress.org User Name', true ) ) {
- $this->add_mentor( $post, $mentor_username );
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ public function update_mentor( $post_id ) {
+ if ( $this->get_event_type() !== get_post_type() ) {
+ return;
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Post meta keys
- $wcpt_meta_keys = WordCamp_Admin::meta_keys();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // If the Mentor username changed, update the site
+ $mentor_username = $_POST[ wcpt_key_to_str( 'Mentor WordPress.org User Name', 'wcpt_' ) ];
+ if ( $mentor_username !== get_post_meta( $post_id, 'Mentor WordPress.org User Name', true ) ) {
+ $this->add_mentor( get_post( $post_id ), $mentor_username );
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Loop through meta keys and update
- foreach ( $wcpt_meta_keys as $key => $value ) {
- // Get post value
- $post_value = wcpt_key_to_str( $key, 'wcpt_' );
- $values[ $key ] = isset( $_POST[ $post_value ] ) ? esc_attr( $_POST[ $post_value ] ) : '';
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Don't update protected fields
- if ( self::is_protected_field( $key ) ) {
- continue;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * Update venue address co-ords if changed
+ *
+ * These are used for the maps on Central, stats, etc.
+ *
+ * @param int $post_id Post id
+ */
+ public function update_venue_address( $post_id ) {
+ if ( $this->get_event_type() !== get_post_type() ) {
+ return;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- switch ( $value ) {
- case 'text' :
- case 'textarea' :
- update_post_meta( $post_id, $key, $values[ $key ] );
- break;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // If the venue address was changed, update its coordinates
+ $new_address = $_POST[ wcpt_key_to_str( 'Physical Address', 'wcpt_' ) ];
+ if ( $new_address === get_post_meta( $post_id, 'Physical Address', true ) ) {
+ return;
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- case 'number' :
- update_post_meta( $post_id, $key, floatval( $values[ $key ] ) );
- break;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $request_url = add_query_arg(
+ 'address',
+ urlencode( $new_address ),
+ 'https://maps.googleapis.com/maps/api/geocode/json'
+ );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- case 'checkbox' :
- if ( ! empty( $values[ $key ] ) && 'on' == $values[ $key ] ) {
- update_post_meta( $post_id, $key, true );
- } else {
- update_post_meta( $post_id, $key, false );
- }
- break;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $response = wcorg_redundant_remote_get( $request_url );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- case 'date' :
- if ( !empty( $values[ $key ] ) ) {
- $values[ $key ] = strtotime( $values[ $key ] );
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Don't delete the existing (and probably good) values if the request failed
+ if ( is_wp_error( $response ) ) {
+ return;
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- update_post_meta( $post_id, $key, $values[ $key ] );
- break;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $meta_values = $this->parse_geocode_response( $response );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- case 'select-currency' :
- $currencies = WordCamp_Budgets::get_currencies();
- $new_value = ( array_key_exists( $values[ $key ], $currencies ) ) ? $values[ $key ] : '';
-
- update_post_meta( $post_id, $key, $new_value );
- break;
-
- default:
- do_action( 'wcpt_metabox_save', $key, $value, $post_id );
- break;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ foreach ( $meta_values as $key => $value ) {
+ if ( is_null( $value ) ) {
+ delete_post_meta( $post_id, $key );
+ } else {
+ update_post_meta( $post_id, $key, $value );
+ }
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- }
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- do_action( 'wcpt_metabox_save_done', $post_id );
-
- $this->validate_and_add_note( $post_id );
- }
-
- /**
- * Validate and add a new private note
- *
- * @param int $post_id
- */
- protected function validate_and_add_note( $post_id ) {
- if ( empty( $_POST['wcpt_new_note' ] ) )
- return;
-
- check_admin_referer( 'wcpt_notes', 'wcpt_notes_nonce' );
-
- $new_note_message = sanitize_text_field( wp_unslash( $_POST['wcpt_new_note'] ) );
-
- if ( empty( $new_note_message ) ) {
- return;
</del><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Note that this is private, see wcpt_get_log_entries()
- add_post_meta( $post_id, '_note', array(
- 'timestamp' => time(),
- 'user_id' => get_current_user_id(),
- 'message' => $new_note_message,
- ) );
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * Parse the values we want out of the Geocode API response
+ *
+ * @see https://developers.google.com/maps/documentation/geocoding/intro#Types API response schema
+ *
+ * @param $response
+ *
+ * @return array
+ */
+ protected function parse_geocode_response( $response ) {
+ $body = json_decode( wp_remote_retrieve_body( $response ) );
+ $body = isset( $body->results[0] ) ? $body->results[0] : null;
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * Store the individual components of a camp's venue address
- *
- * These are used for the maps on Central, stats, etc.
- *
- * @param int $post_id
- * @param string $address
- */
- function update_venue_address( $post_id, $address ) {
- $request_url = add_query_arg(
- 'address',
- urlencode( $address ),
- 'https://maps.googleapis.com/maps/api/geocode/json'
- );
-
- $response = wcorg_redundant_remote_get( $request_url );
-
- // Don't delete the existing (and probably good) values if the request failed
- if ( is_wp_error( $response ) ) {
- return;
- }
-
- $meta_values = $this->parse_geocode_response( $response );
-
- foreach ( $meta_values as $key => $value ) {
- if ( is_null( $value ) ) {
- delete_post_meta( $post_id, $key );
- } else {
- update_post_meta( $post_id, $key, $value );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( isset( $body->geometry->location->lat ) ) {
+ $coordinates = array(
+ 'latitude' => $body->geometry->location->lat,
+ 'longitude' => $body->geometry->location->lng,
+ );
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- }
- }
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * Parse the values we want out of the Geocode API response
- *
- * @see https://developers.google.com/maps/documentation/geocoding/intro#Types API response schema
- *
- * @param $response
- *
- * @return array
- */
- protected function parse_geocode_response( $response ) {
- $body = json_decode( wp_remote_retrieve_body( $response ) );
- $body = isset ( $body->results[0] ) ? $body->results[0] : null;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( isset( $body->address_components ) ) {
+ foreach ( $body->address_components as $component ) {
+ foreach ( $component->types as $type ) {
+ switch ( $type ) {
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( isset( $body->geometry->location->lat ) ) {
- $coordinates = array(
- 'latitude' => $body->geometry->location->lat,
- 'longitude' => $body->geometry->location->lng
- );
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ case 'locality':
+ case 'administrative_area_level_1':
+ case 'postal_code':
+ $$type = $component->long_name;
+ break;
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( isset ( $body->address_components ) ) {
- foreach ( $body->address_components as $component ) {
- foreach ( $component->types as $type ) {
- switch ( $type ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ case 'country':
+ $country_code = $component->short_name; // This is not guaranteed to be ISO 3166-1 alpha-2, but should match in most cases
+ $country_name = $component->long_name;
+ break;
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- case 'locality':
- case 'administrative_area_level_1':
- case 'postal_code':
- $$type = $component->long_name;
- break;
-
- case 'country':
- $country_code = $component->short_name; // This is not guaranteed to be ISO 3166-1 alpha-2, but should match in most cases
- $country_name = $component->long_name;
- break;
-
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ }
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- }
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- $values = array(
- '_venue_coordinates' => isset( $coordinates ) ? $coordinates : null,
- '_venue_city' => isset( $locality ) ? $locality : null,
- '_venue_state' => isset( $administrative_area_level_1 ) ? $administrative_area_level_1 : null,
- '_venue_country_code' => isset( $country_code ) ? $country_code : null,
- '_venue_country_name' => isset( $country_name ) ? $country_name : null,
- '_venue_zip' => isset( $postal_code ) ? $postal_code : null,
- );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $values = array(
+ '_venue_coordinates' => isset( $coordinates ) ? $coordinates : null,
+ '_venue_city' => isset( $locality ) ? $locality : null,
+ '_venue_state' => isset( $administrative_area_level_1 ) ? $administrative_area_level_1 : null,
+ '_venue_country_code' => isset( $country_code ) ? $country_code : null,
+ '_venue_country_name' => isset( $country_name ) ? $country_name : null,
+ '_venue_zip' => isset( $postal_code ) ? $postal_code : null,
+ );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- return $values;
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ return $values;
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * Add the Mentor as an administrator on the given site.
- *
- * @param WP_Post $wordcamp WordCamp post object.
- * @param string $mentor_username Mentor's WP.org user login.
- */
- protected function add_mentor( $wordcamp, $mentor_username ) {
- $blog_id = get_wordcamp_site_id( $wordcamp );
- $new_mentor = get_user_by( 'login', $mentor_username );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * Add the Mentor as an administrator on the given site.
+ *
+ * @param WP_Post $wordcamp WordCamp post object.
+ * @param string $mentor_username Mentor's WP.org user login.
+ */
+ protected function add_mentor( $wordcamp, $mentor_username ) {
+ $blog_id = get_wordcamp_site_id( $wordcamp );
+ $new_mentor = get_user_by( 'login', $mentor_username );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( ! $blog_id || ! $new_mentor ) {
- return;
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( ! $blog_id || ! $new_mentor ) {
+ return;
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- add_user_to_blog( $blog_id, $new_mentor->ID, 'administrator' );
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ add_user_to_blog( $blog_id, $new_mentor->ID, 'administrator' );
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * meta_keys ()
- *
- * Returns post meta key
- *
- * @param string $meta_group
- *
- * @return array
- */
- function meta_keys( $meta_group = '' ) {
- /*
- * Warning: These keys are used for both the input field label and the postmeta key, so if you want to
- * modify an existing label then you'll also need to migrate any rows in the database to use the new key.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * meta_keys ()
</ins><span class="cx" style="display: block; padding: 0 10px"> *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * Some of them are also exposed via the JSON API, so you'd need to build in a back-compat layer for that
- * as well.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * Returns post meta key
</ins><span class="cx" style="display: block; padding: 0 10px"> *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * When adding new keys, updating the wcorg-json-api plugin to either whitelist it, or test that it's not
- * being exposed.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @param string $meta_group
+ *
+ * @return array
</ins><span class="cx" style="display: block; padding: 0 10px"> */
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ static function meta_keys( $meta_group = '' ) {
+ /*
+ * Warning: These keys are used for both the input field label and the postmeta key, so if you want to
+ * modify an existing label then you'll also need to migrate any rows in the database to use the new key.
+ *
+ * Some of them are also exposed via the JSON API, so you'd need to build in a back-compat layer for that
+ * as well.
+ *
+ * When adding new keys, updating the wcorg-json-api plugin to either whitelist it, or test that it's not
+ * being exposed.
+ */
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- switch ( $meta_group ) {
- case 'organizer':
- $retval = array (
- 'Organizer Name' => 'text',
- 'WordPress.org Username' => 'text',
- 'Email Address' => 'text', // Note: This is the lead organizer's e-mail address, which is different than the "E-mail Address" field
- 'Telephone' => 'text',
- 'Mailing Address' => 'textarea',
- 'Sponsor Wrangler Name' => 'text',
- 'Sponsor Wrangler E-mail Address' => 'text',
- 'Budget Wrangler Name' => 'text',
- 'Budget Wrangler E-mail Address' => 'text',
- 'Venue Wrangler Name' => 'text',
- 'Venue Wrangler E-mail Address' => 'text',
- 'Speaker Wrangler Name' => 'text',
- 'Speaker Wrangler E-mail Address' => 'text',
- 'Food/Beverage Wrangler Name' => 'text',
- 'Food/Beverage Wrangler E-mail Address' => 'text',
- 'Swag Wrangler Name' => 'text',
- 'Swag Wrangler E-mail Address' => 'text',
- 'Volunteer Wrangler Name' => 'text',
- 'Volunteer Wrangler E-mail Address' => 'text',
- 'Printing Wrangler Name' => 'text',
- 'Printing Wrangler E-mail Address' => 'text',
- 'Design Wrangler Name' => 'text',
- 'Design Wrangler E-mail Address' => 'text',
- 'Website Wrangler Name' => 'text',
- 'Website Wrangler E-mail Address' => 'text',
- 'Social Media/Publicity Wrangler Name' => 'text',
- 'Social Media/Publicity Wrangler E-mail Address' => 'text',
- 'A/V Wrangler Name' => 'text',
- 'A/V Wrangler E-mail Address' => 'text',
- 'Party Wrangler Name' => 'text',
- 'Party Wrangler E-mail Address' => 'text',
- 'Travel Wrangler Name' => 'text',
- 'Travel Wrangler E-mail Address' => 'text',
- 'Safety Wrangler Name' => 'text',
- 'Safety Wrangler E-mail Address' => 'text',
- 'Mentor WordPress.org User Name' => 'text',
- 'Mentor Name' => 'text',
- 'Mentor E-mail Address' => 'text',
- );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ switch ( $meta_group ) {
+ case 'organizer':
+ $retval = array(
+ 'Organizer Name' => 'text',
+ 'WordPress.org Username' => 'text',
+ 'Email Address' => 'text', // Note: This is the lead organizer's e-mail address, which is different than the "E-mail Address" field
+ 'Telephone' => 'text',
+ 'Mailing Address' => 'textarea',
+ 'Sponsor Wrangler Name' => 'text',
+ 'Sponsor Wrangler E-mail Address' => 'text',
+ 'Budget Wrangler Name' => 'text',
+ 'Budget Wrangler E-mail Address' => 'text',
+ 'Venue Wrangler Name' => 'text',
+ 'Venue Wrangler E-mail Address' => 'text',
+ 'Speaker Wrangler Name' => 'text',
+ 'Speaker Wrangler E-mail Address' => 'text',
+ 'Food/Beverage Wrangler Name' => 'text',
+ 'Food/Beverage Wrangler E-mail Address' => 'text',
+ 'Swag Wrangler Name' => 'text',
+ 'Swag Wrangler E-mail Address' => 'text',
+ 'Volunteer Wrangler Name' => 'text',
+ 'Volunteer Wrangler E-mail Address' => 'text',
+ 'Printing Wrangler Name' => 'text',
+ 'Printing Wrangler E-mail Address' => 'text',
+ 'Design Wrangler Name' => 'text',
+ 'Design Wrangler E-mail Address' => 'text',
+ 'Website Wrangler Name' => 'text',
+ 'Website Wrangler E-mail Address' => 'text',
+ 'Social Media/Publicity Wrangler Name' => 'text',
+ 'Social Media/Publicity Wrangler E-mail Address' => 'text',
+ 'A/V Wrangler Name' => 'text',
+ 'A/V Wrangler E-mail Address' => 'text',
+ 'Party Wrangler Name' => 'text',
+ 'Party Wrangler E-mail Address' => 'text',
+ 'Travel Wrangler Name' => 'text',
+ 'Travel Wrangler E-mail Address' => 'text',
+ 'Safety Wrangler Name' => 'text',
+ 'Safety Wrangler E-mail Address' => 'text',
+ 'Mentor WordPress.org User Name' => 'text',
+ 'Mentor Name' => 'text',
+ 'Mentor E-mail Address' => 'text',
+ );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- break;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ break;
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- case 'venue':
- $retval = array (
- 'Venue Name' => 'text',
- 'Physical Address' => 'textarea',
- 'Maximum Capacity' => 'text',
- 'Available Rooms' => 'text',
- 'Website URL' => 'text',
- 'Contact Information' => 'textarea',
- 'Exhibition Space Available' => 'checkbox',
- );
- break;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ case 'venue':
+ $retval = array(
+ 'Venue Name' => 'text',
+ 'Physical Address' => 'textarea',
+ 'Maximum Capacity' => 'text',
+ 'Available Rooms' => 'text',
+ 'Website URL' => 'text',
+ 'Contact Information' => 'textarea',
+ 'Exhibition Space Available' => 'checkbox',
+ );
+ break;
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- case 'contributor':
- // These fields names need to be unique, hence the 'Contributor' prefix on each one
- $retval = array (
- 'Contributor Day' => 'checkbox',
- 'Contributor Day Date (YYYY-mm-dd)' => 'date',
- 'Contributor Venue Name' => 'text',
- 'Contributor Venue Address' => 'textarea',
- 'Contributor Venue Capacity' => 'text',
- 'Contributor Venue Website URL' => 'text',
- 'Contributor Venue Contact Info' => 'textarea',
- );
- break;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ case 'contributor':
+ // These fields names need to be unique, hence the 'Contributor' prefix on each one
+ $retval = array(
+ 'Contributor Day' => 'checkbox',
+ 'Contributor Day Date (YYYY-mm-dd)' => 'date',
+ 'Contributor Venue Name' => 'text',
+ 'Contributor Venue Address' => 'textarea',
+ 'Contributor Venue Capacity' => 'text',
+ 'Contributor Venue Website URL' => 'text',
+ 'Contributor Venue Contact Info' => 'textarea',
+ );
+ break;
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- case 'wordcamp':
- $retval = array (
- 'Start Date (YYYY-mm-dd)' => 'date',
- 'End Date (YYYY-mm-dd)' => 'date',
- 'Location' => 'text',
- 'URL' => 'wc-url',
- 'E-mail Address' => 'text',
- // Note: This is the address for the entire organizing team, which is different than the "Email Address" field
- 'Twitter' => 'text',
- 'WordCamp Hashtag' => 'text',
- 'Number of Anticipated Attendees' => 'text',
- 'Multi-Event Sponsor Region' => 'mes-dropdown',
- 'Global Sponsorship Grant Currency' => 'select-currency',
- 'Global Sponsorship Grant Amount' => 'number',
- 'Global Sponsorship Grant' => 'text',
- );
- break;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ case 'wordcamp':
+ $retval = array(
+ 'Start Date (YYYY-mm-dd)' => 'date',
+ 'End Date (YYYY-mm-dd)' => 'date',
+ 'Location' => 'text',
+ 'URL' => 'wc-url',
+ 'E-mail Address' => 'text',
+ // Note: This is the address for the entire organizing team, which is different than the "Email Address" field
+ 'Twitter' => 'text',
+ 'WordCamp Hashtag' => 'text',
+ 'Number of Anticipated Attendees' => 'text',
+ 'Multi-Event Sponsor Region' => 'mes-dropdown',
+ 'Global Sponsorship Grant Currency' => 'select-currency',
+ 'Global Sponsorship Grant Amount' => 'number',
+ 'Global Sponsorship Grant' => 'text',
+ );
+ break;
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- case 'all':
- default:
- $retval = array(
- 'Start Date (YYYY-mm-dd)' => 'date',
- 'End Date (YYYY-mm-dd)' => 'date',
- 'Location' => 'text',
- 'URL' => 'wc-url',
- 'E-mail Address' => 'text',
- 'Twitter' => 'text',
- 'WordCamp Hashtag' => 'text',
- 'Number of Anticipated Attendees' => 'text',
- 'Multi-Event Sponsor Region' => 'mes-dropdown',
- 'Global Sponsorship Grant Currency' => 'select-currency',
- 'Global Sponsorship Grant Amount' => 'number',
- 'Global Sponsorship Grant' => 'text',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ case 'all':
+ default:
+ $retval = array(
+ 'Start Date (YYYY-mm-dd)' => 'date',
+ 'End Date (YYYY-mm-dd)' => 'date',
+ 'Location' => 'text',
+ 'URL' => 'wc-url',
+ 'E-mail Address' => 'text',
+ 'Twitter' => 'text',
+ 'WordCamp Hashtag' => 'text',
+ 'Number of Anticipated Attendees' => 'text',
+ 'Multi-Event Sponsor Region' => 'mes-dropdown',
+ 'Global Sponsorship Grant Currency' => 'select-currency',
+ 'Global Sponsorship Grant Amount' => 'number',
+ 'Global Sponsorship Grant' => 'text',
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- 'Organizer Name' => 'text',
- 'WordPress.org Username' => 'text',
- 'Email Address' => 'text',
- 'Telephone' => 'text',
- 'Mailing Address' => 'textarea',
- 'Sponsor Wrangler Name' => 'text',
- 'Sponsor Wrangler E-mail Address' => 'text',
- 'Budget Wrangler Name' => 'text',
- 'Budget Wrangler E-mail Address' => 'text',
- 'Venue Wrangler Name' => 'text',
- 'Venue Wrangler E-mail Address' => 'text',
- 'Speaker Wrangler Name' => 'text',
- 'Speaker Wrangler E-mail Address' => 'text',
- 'Food/Beverage Wrangler Name' => 'text',
- 'Food/Beverage Wrangler E-mail Address' => 'text',
- 'Swag Wrangler Name' => 'text',
- 'Swag Wrangler E-mail Address' => 'text',
- 'Volunteer Wrangler Name' => 'text',
- 'Volunteer Wrangler E-mail Address' => 'text',
- 'Printing Wrangler Name' => 'text',
- 'Printing Wrangler E-mail Address' => 'text',
- 'Design Wrangler Name' => 'text',
- 'Design Wrangler E-mail Address' => 'text',
- 'Website Wrangler Name' => 'text',
- 'Website Wrangler E-mail Address' => 'text',
- 'Social Media/Publicity Wrangler Name' => 'text',
- 'Social Media/Publicity Wrangler E-mail Address' => 'text',
- 'A/V Wrangler Name' => 'text',
- 'A/V Wrangler E-mail Address' => 'text',
- 'Party Wrangler Name' => 'text',
- 'Party Wrangler E-mail Address' => 'text',
- 'Travel Wrangler Name' => 'text',
- 'Travel Wrangler E-mail Address' => 'text',
- 'Safety Wrangler Name' => 'text',
- 'Safety Wrangler E-mail Address' => 'text',
- 'Mentor WordPress.org User Name' => 'text',
- 'Mentor Name' => 'text',
- 'Mentor E-mail Address' => 'text',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ 'Organizer Name' => 'text',
+ 'WordPress.org Username' => 'text',
+ 'Email Address' => 'text',
+ 'Telephone' => 'text',
+ 'Mailing Address' => 'textarea',
+ 'Sponsor Wrangler Name' => 'text',
+ 'Sponsor Wrangler E-mail Address' => 'text',
+ 'Budget Wrangler Name' => 'text',
+ 'Budget Wrangler E-mail Address' => 'text',
+ 'Venue Wrangler Name' => 'text',
+ 'Venue Wrangler E-mail Address' => 'text',
+ 'Speaker Wrangler Name' => 'text',
+ 'Speaker Wrangler E-mail Address' => 'text',
+ 'Food/Beverage Wrangler Name' => 'text',
+ 'Food/Beverage Wrangler E-mail Address' => 'text',
+ 'Swag Wrangler Name' => 'text',
+ 'Swag Wrangler E-mail Address' => 'text',
+ 'Volunteer Wrangler Name' => 'text',
+ 'Volunteer Wrangler E-mail Address' => 'text',
+ 'Printing Wrangler Name' => 'text',
+ 'Printing Wrangler E-mail Address' => 'text',
+ 'Design Wrangler Name' => 'text',
+ 'Design Wrangler E-mail Address' => 'text',
+ 'Website Wrangler Name' => 'text',
+ 'Website Wrangler E-mail Address' => 'text',
+ 'Social Media/Publicity Wrangler Name' => 'text',
+ 'Social Media/Publicity Wrangler E-mail Address' => 'text',
+ 'A/V Wrangler Name' => 'text',
+ 'A/V Wrangler E-mail Address' => 'text',
+ 'Party Wrangler Name' => 'text',
+ 'Party Wrangler E-mail Address' => 'text',
+ 'Travel Wrangler Name' => 'text',
+ 'Travel Wrangler E-mail Address' => 'text',
+ 'Safety Wrangler Name' => 'text',
+ 'Safety Wrangler E-mail Address' => 'text',
+ 'Mentor WordPress.org User Name' => 'text',
+ 'Mentor Name' => 'text',
+ 'Mentor E-mail Address' => 'text',
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- 'Venue Name' => 'text',
- 'Physical Address' => 'textarea',
- 'Maximum Capacity' => 'text',
- 'Available Rooms' => 'text',
- 'Website URL' => 'text',
- 'Contact Information' => 'textarea',
- 'Exhibition Space Available' => 'checkbox',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ 'Venue Name' => 'text',
+ 'Physical Address' => 'textarea',
+ 'Maximum Capacity' => 'text',
+ 'Available Rooms' => 'text',
+ 'Website URL' => 'text',
+ 'Contact Information' => 'textarea',
+ 'Exhibition Space Available' => 'checkbox',
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- 'Contributor Day' => 'checkbox',
- 'Contributor Day Date (YYYY-mm-dd)' => 'date',
- 'Contributor Venue Name' => 'text',
- 'Contributor Venue Address' => 'textarea',
- 'Contributor Venue Capacity' => 'text',
- 'Contributor Venue Website URL' => 'text',
- 'Contributor Venue Contact Info' => 'textarea',
- );
- break;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ 'Contributor Day' => 'checkbox',
+ 'Contributor Day Date (YYYY-mm-dd)' => 'date',
+ 'Contributor Venue Name' => 'text',
+ 'Contributor Venue Address' => 'textarea',
+ 'Contributor Venue Capacity' => 'text',
+ 'Contributor Venue Website URL' => 'text',
+ 'Contributor Venue Contact Info' => 'textarea',
+ );
+ break;
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ }
+
+ return apply_filters( 'wcpt_admin_meta_keys', $retval, $meta_group );
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- return apply_filters( 'wcpt_admin_meta_keys', $retval, $meta_group );
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * Fired during admin_print_styles
+ * Adds jQuery UI
+ */
+ function admin_scripts() {
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * Fired during admin_print_styles
- * Adds jQuery UI
- */
- function admin_scripts() {
- wp_register_script(
- 'wcpt-admin',
- WCPT_URL . 'javascript/wcpt-wordcamp/admin.js',
- array( 'jquery', 'jquery-ui-datepicker' ),
- WCPT_VERSION,
- true
- );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Edit WordCamp screen
+ if ( WCPT_POST_TYPE_ID === get_post_type() ) {
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Edit WordCamp screen
- if ( WCPT_POST_TYPE_ID === get_post_type() ) {
- wp_enqueue_script( 'wcpt-admin' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Default data
+ $data = array(
+ 'Mentors' => array(
+ 'l10n' => array(
+ 'selectLabel' => esc_html__( 'Available mentors', 'wordcamporg' ),
+ 'confirm' => esc_html__( 'Update Mentor field contents?', 'wordcamporg' ),
+ ),
+ ),
+ );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Default data
- $data = array(
- 'Mentors' => array(
- 'l10n' => array(
- 'selectLabel' => esc_html__( 'Available mentors', 'wordcamporg' ),
- 'confirm' => esc_html__( 'Update Mentor field contents?', 'wordcamporg' ),
- ),
- )
- );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Only include mentor data if the Mentor username field is editable
+ if ( current_user_can( 'wordcamp_manage_mentors' ) ) {
+ $data['Mentors']['data'] = Mentors_Dashboard\get_all_mentor_data();
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Only include mentor data if the Mentor username field is editable
- if ( current_user_can( 'wordcamp_manage_mentors' ) ) {
- $data['Mentors']['data'] = Mentors_Dashboard\get_all_mentor_data();
- }
-
- wp_localize_script(
- 'wcpt-admin',
- 'wordCampPostType',
- $data
- );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ wp_localize_script(
+ 'wcpt-admin',
+ 'wordCampPostType',
+ $data
+ );
+ }
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- wp_enqueue_script( 'select2' );
- }
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- function admin_styles() {
- if ( get_post_type() == WCPT_POST_TYPE_ID ) {
- wp_enqueue_style( 'jquery-ui' );
- wp_enqueue_style( 'wp-datepicker-skins' );
- }
- wp_enqueue_style( 'select2' );
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * admin_head ()
+ *
+ * Add some general styling to the admin area
+ */
+ function admin_head() {
+ if ( ! empty( $_GET['post_type'] ) && $_GET['post_type'] == WCPT_POST_TYPE_ID ) : ?>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * admin_head ()
- *
- * Add some general styling to the admin area
- */
- function admin_head() {
- if ( !empty( $_GET['post_type'] ) && $_GET['post_type'] == WCPT_POST_TYPE_ID ) : ?>
-
</del><span class="cx" style="display: block; padding: 0 10px"> .column-title { width: 40%; }
</span><span class="cx" style="display: block; padding: 0 10px"> .column-wcpt_location, .column-wcpt_date, column-wcpt_organizer { white-space: nowrap; }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <?php endif;
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <?php
+ endif;
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * user_profile_update ()
- *
- * Responsible for showing additional profile options and settings
- *
- * @todo Everything
- */
- function user_profile_update( $user_id ) {
- if ( !wcpt_has_access() )
- return false;
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * user_profile_update ()
+ *
+ * Responsible for showing additional profile options and settings
+ *
+ * @todo Everything
+ */
+ function user_profile_update( $user_id ) {
+ if ( ! wcpt_has_access() ) {
+ return false;
+ }
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * user_profile_wordcamp ()
- *
- * Responsible for saving additional profile options and settings
- *
- * @todo Everything
- */
- function user_profile_wordcamp( $profileuser ) {
- if ( !wcpt_has_access() )
- return false;
- ?>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * user_profile_wordcamp ()
+ *
+ * Responsible for saving additional profile options and settings
+ *
+ * @todo Everything
+ */
+ function user_profile_wordcamp( $profileuser ) {
+ if ( ! wcpt_has_access() ) {
+ return false;
+ }
+ ?>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><span class="cx" style="display: block; padding: 0 10px"> <h3><?php _e( 'WordCamps', 'wcpt' ); ?></h3>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -656,516 +530,501 @@
</span><span class="cx" style="display: block; padding: 0 10px"> </tr>
</span><span class="cx" style="display: block; padding: 0 10px"> </table>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <?php
- }
-
- /**
- * column_headers ()
- *
- * Manage the column headers
- *
- * @param array $columns
- * @return array $columns
- */
- function column_headers( $columns ) {
- $columns = array (
- 'cb' => '<input type="checkbox" />',
- 'title' => __( 'Title', 'wcpt' ),
- //'wcpt_location' => __( 'Location', 'wcpt' ),
- 'wcpt_date' => __( 'Date', 'wcpt' ),
- 'wcpt_organizer' => __( 'Organizer', 'wcpt' ),
- 'wcpt_venue' => __( 'Venue', 'wcpt' ),
- 'date' => __( 'Status', 'wcpt' )
- );
- return $columns;
- }
-
- /**
- * Display the status of a WordCamp post
- *
- * @param array $states
- *
- * @return array
- */
- public function display_post_states( $states ) {
- global $post;
-
- if ( $post->post_type != WCPT_POST_TYPE_ID ) {
- return $states;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <?php
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- $status = get_post_status_object( $post->post_status );
- if ( get_query_var( 'post_status' ) != $post->post_status ) {
- $states[ $status->name ] = $status->label;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * column_headers ()
+ *
+ * Manage the column headers
+ *
+ * @param array $columns
+ * @return array $columns
+ */
+ function column_headers( $columns ) {
+ $columns = array(
+ 'cb' => '<input type="checkbox" />',
+ 'title' => __( 'Title', 'wcpt' ),
+ // 'wcpt_location' => __( 'Location', 'wcpt' ),
+ 'wcpt_date' => __( 'Date', 'wcpt' ),
+ 'wcpt_organizer' => __( 'Organizer', 'wcpt' ),
+ 'wcpt_venue' => __( 'Venue', 'wcpt' ),
+ 'date' => __( 'Status', 'wcpt' ),
+ );
+ return $columns;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- return $states;
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * column_data ( $column, $post_id )
+ *
+ * Print extra columns
+ *
+ * @param string $column
+ * @param int $post_id
+ */
+ function column_data( $column, $post_id ) {
+ if ( $_GET['post_type'] !== WCPT_POST_TYPE_ID ) {
+ return $column;
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * column_data ( $column, $post_id )
- *
- * Print extra columns
- *
- * @param string $column
- * @param int $post_id
- */
- function column_data( $column, $post_id ) {
- if ( $_GET['post_type'] !== WCPT_POST_TYPE_ID )
- return $column;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ switch ( $column ) {
+ case 'wcpt_location':
+ echo wcpt_get_wordcamp_location() ? wcpt_get_wordcamp_location() : __( 'No Location', 'wcpt' );
+ break;
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- switch ( $column ) {
- case 'wcpt_location' :
- echo wcpt_get_wordcamp_location() ? wcpt_get_wordcamp_location() : __( 'No Location', 'wcpt' );
- break;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ case 'wcpt_date':
+ // Has a start date
+ if ( $start = wcpt_get_wordcamp_start_date() ) {
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- case 'wcpt_date' :
- // Has a start date
- if ( $start = wcpt_get_wordcamp_start_date() ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Has an end date
+ if ( $end = wcpt_get_wordcamp_end_date() ) {
+ $string_date = sprintf( __( 'Start: %1$s<br />End: %2$s', 'wcpt' ), $start, $end );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Has an end date
- if ( $end = wcpt_get_wordcamp_end_date() ) {
- $string_date = sprintf( __( 'Start: %1$s<br />End: %2$s', 'wcpt' ), $start, $end );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // No end date
+ } else {
+ $string_date = sprintf( __( 'Start: %1$s', 'wcpt' ), $start );
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // No end date
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // No date
</ins><span class="cx" style="display: block; padding: 0 10px"> } else {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- $string_date = sprintf( __( 'Start: %1$s', 'wcpt' ), $start );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $string_date = __( 'No Date', 'wcpt' );
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // No date
- } else {
- $string_date = __( 'No Date', 'wcpt' );
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ echo $string_date;
+ break;
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- echo $string_date;
- break;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ case 'wcpt_organizer':
+ echo wcpt_get_wordcamp_organizer_name() ? wcpt_get_wordcamp_organizer_name() : __( 'No Organizer', 'wcpt' );
+ break;
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- case 'wcpt_organizer' :
- echo wcpt_get_wordcamp_organizer_name() ? wcpt_get_wordcamp_organizer_name() : __( 'No Organizer', 'wcpt' );
- break;
-
- case 'wcpt_venue' :
- echo wcpt_get_wordcamp_venue_name() ? wcpt_get_wordcamp_venue_name() : __( 'No Venue', 'wcpt' );
- break;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ case 'wcpt_venue':
+ echo wcpt_get_wordcamp_venue_name() ? wcpt_get_wordcamp_venue_name() : __( 'No Venue', 'wcpt' );
+ break;
+ }
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- }
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * post_row_actions ( $actions, $post )
- *
- * Remove the quick-edit action link and display the description under
- *
- * @param array $actions
- * @param array $post
- * @return array $actions
- */
- function post_row_actions( $actions, $post ) {
- if ( WCPT_POST_TYPE_ID == $post->post_type ) {
- unset( $actions['inline hide-if-no-js'] );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * post_row_actions ( $actions, $post )
+ *
+ * Remove the quick-edit action link and display the description under
+ *
+ * @param array $actions
+ * @param array $post
+ * @return array $actions
+ */
+ function post_row_actions( $actions, $post ) {
+ if ( WCPT_POST_TYPE_ID == $post->post_type ) {
+ unset( $actions['inline hide-if-no-js'] );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- $wc = array();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $wc = array();
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( $wc_location = wcpt_get_wordcamp_location() )
- $wc['location'] = $wc_location;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( $wc_location = wcpt_get_wordcamp_location() ) {
+ $wc['location'] = $wc_location;
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( $wc_url = make_clickable( wcpt_get_wordcamp_url() ) )
- $wc['url'] = $wc_url;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( $wc_url = make_clickable( wcpt_get_wordcamp_url() ) ) {
+ $wc['url'] = $wc_url;
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- echo implode( ' - ', (array) $wc );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ echo implode( ' - ', (array) $wc );
+ }
+
+ return $actions;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- return $actions;
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * Trigger actions related to WordCamps being scheduled.
+ *
+ * @param string $new_status
+ * @param string $old_status
+ * @param WP_Post $post
+ */
+ public function trigger_schedule_actions( $new_status, $old_status, $post ) {
+ if ( empty( $post->post_type ) || WCPT_POST_TYPE_ID != $post->post_type ) {
+ return;
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * Trigger actions related to WordCamps being scheduled.
- *
- * @param string $new_status
- * @param string $old_status
- * @param WP_Post $post
- */
- public function trigger_schedule_actions( $new_status, $old_status, $post ) {
- if ( empty( $post->post_type ) || WCPT_POST_TYPE_ID != $post->post_type ) {
- return;
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( $new_status == $old_status ) {
+ return;
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( $new_status == $old_status ) {
- return;
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( 'wcpt-pre-planning' == $new_status ) {
+ do_action( 'wcpt_approved_for_pre_planning', $post );
+ } elseif ( $old_status == 'wcpt-needs-schedule' && $new_status == 'wcpt-scheduled' ) {
+ do_action( 'wcpt_added_to_final_schedule', $post );
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( 'wcpt-pre-planning' == $new_status ) {
- do_action( 'wcpt_approved_for_pre_planning', $post );
- } elseif ( $old_status == 'wcpt-needs-schedule' && $new_status == 'wcpt-scheduled' ) {
- do_action( 'wcpt_added_to_final_schedule', $post );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // todo add new triggers - which ones?
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // todo add new triggers - which ones?
- }
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * Log when the post status changes
- *
- * @param string $new_status
- * @param string $old_status
- * @param WP_Post $post
- */
- public function log_status_changes( $new_status, $old_status, $post ) {
- if ( $new_status === $old_status || $new_status == 'auto-draft' ) {
- return;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * Add the lead organizer to Central when a WordCamp application is accepted.
+ *
+ * Adding the lead organizer to Central allows them to enter all the `wordcamp`
+ * meta info themselves, and also post updates to the Central blog.
+ *
+ * @param WP_Post $post
+ */
+ public function add_organizer_to_central( $post ) {
+ $lead_organizer = get_user_by( 'login', $_POST['wcpt_wordpress_org_username'] );
+
+ if ( $lead_organizer && add_user_to_blog( get_current_blog_id(), $lead_organizer->ID, 'contributor' ) ) {
+ do_action( 'wcor_organizer_added_to_central', $post );
+ }
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( empty( $post->post_type ) || WCPT_POST_TYPE_ID != $post->post_type ) {
- return;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * Record when the WordCamp was added to the planning schedule.
+ *
+ * This is used by the Organizer Reminders plugin to send automated e-mails at certain points after the camp
+ * has been added to the planning schedule.
+ *
+ * @param WP_Post $wordcamp
+ */
+ public function mark_date_added_to_planning_schedule( $wordcamp ) {
+ update_post_meta( $wordcamp->ID, '_timestamp_added_to_planning_schedule', time() );
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- $old_status = get_post_status_object( $old_status );
- $new_status = get_post_status_object( $new_status );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * Enforce a valid post status for WordCamps.
+ *
+ * @param array $post_data
+ * @param array $post_data_raw
+ * @return array
+ */
+ public function enforce_post_status( $post_data, $post_data_raw ) {
+ if ( $post_data['post_type'] != WCPT_POST_TYPE_ID || empty( $_POST['post_ID'] ) ) {
+ return $post_data;
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- add_post_meta( $post->ID, '_status_change', array(
- 'timestamp' => time(),
- 'user_id' => get_current_user_id(),
- 'message' => sprintf( '%s → %s', $old_status->label, $new_status->label ),
- ) );
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $post = get_post( $_POST['post_ID'] );
+ if ( ! $post ) {
+ return $post_data;
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * Add the lead organizer to Central when a WordCamp application is accepted.
- *
- * Adding the lead organizer to Central allows them to enter all the `wordcamp`
- * meta info themselves, and also post updates to the Central blog.
- *
- * @param WP_Post $post
- */
- public function add_organizer_to_central( $post ) {
- $lead_organizer = get_user_by( 'login', $_POST['wcpt_wordpress_org_username'] );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( ! empty( $post_data['post_status'] ) ) {
+ $wcpt = get_post_type_object( WCPT_POST_TYPE_ID );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( $lead_organizer && add_user_to_blog( get_current_blog_id(), $lead_organizer->ID, 'contributor' ) ) {
- do_action( 'wcor_organizer_added_to_central', $post );
- }
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Only WordCamp Wranglers can change WordCamp statuses.
+ if ( ! current_user_can( 'wordcamp_wrangle_wordcamps' ) ) {
+ $post_data['post_status'] = $post->post_status;
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * Record when the WordCamp was added to the planning schedule.
- *
- * This is used by the Organizer Reminders plugin to send automated e-mails at certain points after the camp
- * has been added to the planning schedule.
- *
- * @param WP_Post $wordcamp
- */
- public function mark_date_added_to_planning_schedule( $wordcamp ) {
- update_post_meta( $wordcamp->ID, '_timestamp_added_to_planning_schedule', time() );
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Enforce a valid status.
+ $statuses = array_keys( WordCamp_Loader::get_post_statuses() );
+ $statuses = array_merge( $statuses, array( 'trash' ) );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * Enforce a valid post status for WordCamps.
- *
- * @param array $post_data
- * @param array $post_data_raw
- * @return array
- */
- public function enforce_post_status( $post_data, $post_data_raw ) {
- if ( $post_data['post_type'] != WCPT_POST_TYPE_ID || empty( $_POST['post_ID'] ) ) {
- return $post_data;
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( ! in_array( $post_data['post_status'], $statuses ) ) {
+ $post_data['post_status'] = $statuses[0];
+ }
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- $post = get_post( $_POST['post_ID'] );
- if ( ! $post ) {
</del><span class="cx" style="display: block; padding: 0 10px"> return $post_data;
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( ! empty( $post_data['post_status'] ) ) {
- $wcpt = get_post_type_object( WCPT_POST_TYPE_ID );
-
- // Only WordCamp Wranglers can change WordCamp statuses.
- if ( ! current_user_can( 'wordcamp_wrangle_wordcamps' ) ) {
- $post_data['post_status'] = $post->post_status;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * Prevent WordCamp posts from being set to pending or published until all the required fields are completed.
+ *
+ * @param array $post_data
+ * @param array $post_data_raw
+ * @return array
+ */
+ public function require_complete_meta_to_publish_wordcamp( $post_data, $post_data_raw ) {
+ if ( WCPT_POST_TYPE_ID != $post_data['post_type'] ) {
+ return $post_data;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Enforce a valid status.
- $statuses = array_keys( WordCamp_Loader::get_post_statuses() );
- $statuses = array_merge( $statuses, array( 'trash' ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // The ID of the last site that was created before this rule went into effect, so that we don't apply the rule retroactively.
+ $min_site_id = apply_filters( 'wcpt_require_complete_meta_min_site_id', '2416297' );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( ! in_array( $post_data['post_status'], $statuses ) ) {
- $post_data['post_status'] = $statuses[0];
- }
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $required_needs_site_fields = $this->get_required_fields( 'needs-site' );
+ $required_scheduled_fields = $this->get_required_fields( 'scheduled' );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- return $post_data;
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Check pending posts
+ if ( 'wcpt-needs-site' == $post_data['post_status'] && absint( $_POST['post_ID'] ) > $min_site_id ) {
+ foreach ( $required_needs_site_fields as $field ) {
+ $value = $_POST[ wcpt_key_to_str( $field, 'wcpt_' ) ];
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * Prevent WordCamp posts from being set to pending or published until all the required fields are completed.
- *
- * @param array $post_data
- * @param array $post_data_raw
- * @return array
- */
- public function require_complete_meta_to_publish_wordcamp( $post_data, $post_data_raw ) {
- if ( WCPT_POST_TYPE_ID != $post_data['post_type'] ) {
- return $post_data;
- }
-
- // The ID of the last site that was created before this rule went into effect, so that we don't apply the rule retroactively.
- $min_site_id = apply_filters( 'wcpt_require_complete_meta_min_site_id', '2416297' );
-
- $required_needs_site_fields = $this->get_required_fields( 'needs-site' );
- $required_scheduled_fields = $this->get_required_fields( 'scheduled' );
-
- // Check pending posts
- if ( 'wcpt-needs-site' == $post_data['post_status'] && absint( $_POST['post_ID'] ) > $min_site_id ) {
- foreach( $required_needs_site_fields as $field ) {
- $value = $_POST[ wcpt_key_to_str( $field, 'wcpt_' ) ];
-
- if ( empty( $value ) || 'null' == $value ) {
- $post_data['post_status'] = 'wcpt-needs-email';
- $this->active_admin_notices[] = 1;
- break;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( empty( $value ) || 'null' == $value ) {
+ $post_data['post_status'] = 'wcpt-needs-email';
+ $this->active_admin_notices[] = 1;
+ break;
+ }
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- }
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Check published posts
- if ( 'wcpt-scheduled' == $post_data['post_status'] && isset( $_POST['post_ID'] ) && absint( $_POST['post_ID'] ) > $min_site_id ) {
- foreach( $required_scheduled_fields as $field ) {
- $value = $_POST[ wcpt_key_to_str( $field, 'wcpt_' ) ];
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Check published posts
+ if ( 'wcpt-scheduled' == $post_data['post_status'] && isset( $_POST['post_ID'] ) && absint( $_POST['post_ID'] ) > $min_site_id ) {
+ foreach ( $required_scheduled_fields as $field ) {
+ $value = $_POST[ wcpt_key_to_str( $field, 'wcpt_' ) ];
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( empty( $value ) || 'null' == $value ) {
- $post_data['post_status'] = 'wcpt-needs-schedule';
- $this->active_admin_notices[] = 3;
- break;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( empty( $value ) || 'null' == $value ) {
+ $post_data['post_status'] = 'wcpt-needs-schedule';
+ $this->active_admin_notices[] = 3;
+ break;
+ }
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+ return $post_data;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- return $post_data;
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * Get a list of fields required to move to a certain post status
+ *
+ * @param string $status 'needs-site' | 'scheduled' | 'any'
+ *
+ * @return array
+ */
+ public static function get_required_fields( $status ) {
+ $needs_site = array( 'E-mail Address' );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * Get a list of fields required to move to a certain post status
- *
- * @param string $status 'needs-site' | 'scheduled' | 'any'
- *
- * @return array
- */
- public static function get_required_fields( $status ) {
- $needs_site = array( 'E-mail Address' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $scheduled = array(
+ // WordCamp
+ 'Start Date (YYYY-mm-dd)',
+ 'Location',
+ 'URL',
+ 'E-mail Address',
+ 'Number of Anticipated Attendees',
+ 'Multi-Event Sponsor Region',
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- $scheduled = array(
- // WordCamp
- 'Start Date (YYYY-mm-dd)',
- 'Location',
- 'URL',
- 'E-mail Address',
- 'Number of Anticipated Attendees',
- 'Multi-Event Sponsor Region',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Organizing Team
+ 'Organizer Name',
+ 'WordPress.org Username',
+ 'Email Address',
+ 'Telephone',
+ 'Mailing Address',
+ 'Sponsor Wrangler Name',
+ 'Sponsor Wrangler E-mail Address',
+ 'Budget Wrangler Name',
+ 'Budget Wrangler E-mail Address',
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Organizing Team
- 'Organizer Name',
- 'WordPress.org Username',
- 'Email Address',
- 'Telephone',
- 'Mailing Address',
- 'Sponsor Wrangler Name',
- 'Sponsor Wrangler E-mail Address',
- 'Budget Wrangler Name',
- 'Budget Wrangler E-mail Address',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Venue
+ 'Physical Address', // used to build stats
+ );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Venue
- 'Physical Address' // used to build stats
- );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ switch ( $status ) {
+ case 'needs-site':
+ $required_fields = $needs_site;
+ break;
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- switch ( $status ) {
- case 'needs-site':
- $required_fields = $needs_site;
- break;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ case 'scheduled':
+ $required_fields = $scheduled;
+ break;
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- case 'scheduled':
- $required_fields = $scheduled;
- break;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ case 'any':
+ default:
+ $required_fields = array_merge( $needs_site, $scheduled );
+ break;
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- case 'any':
- default:
- $required_fields = array_merge( $needs_site, $scheduled );
- break;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ return $required_fields;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- return $required_fields;
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ public static function get_protected_fields() {
+ $protected_fields = array();
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * Check if a field should be readonly, based on the current user's caps.
- *
- * @param string $field_name The field to check.
- *
- * @return bool
- */
- public static function is_protected_field( $field_name ) {
- $protected_fields = array();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( ! current_user_can( 'wordcamp_manage_mentors' ) ) {
+ $protected_fields = array_merge(
+ $protected_fields, array(
+ 'Mentor WordPress.org User Name',
+ 'Mentor Name',
+ 'Mentor E-mail Address',
+ )
+ );
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( ! current_user_can( 'wordcamp_manage_mentors' ) ) {
- $protected_fields = array_merge( $protected_fields, array(
- 'Mentor WordPress.org User Name',
- 'Mentor Name',
- 'Mentor E-mail Address',
- ) );
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( ! current_user_can( 'wordcamp_wrangle_wordcamps' ) ) {
+ $protected_fields = array_merge(
+ $protected_fields, array(
+ 'Multi-Event Sponsor Region',
+ )
+ );
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( ! current_user_can( 'wordcamp_wrangle_wordcamps' ) ) {
- $protected_fields = array_merge( $protected_fields, array(
- 'Multi-Event Sponsor Region',
- ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ return $protected_fields;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- return in_array( $field_name, $protected_fields );
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * Check if a field should be readonly, based on the current user's caps.
+ *
+ * @param string $field_name The field to check.
+ *
+ * @return bool
+ */
+ public static function is_protected_field( $field_name ) {
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * Add our custom admin notice keys to the redirect URL.
- *
- * Any member can add a key to $this->active_admin_notices to signify that the corresponding message should
- * be shown when the redirect finished. When it does, print_admin_notices() will examine the URL and create
- * a notice with the message that corresponds to the key.
- *
- * @param $location
- * @param $post_id
- * @return string
- */
- public function add_admin_notices_to_redirect_url( $location, $post_id ) {
- if ( $this->active_admin_notices ) {
- $location = add_query_arg( 'wcpt_messages', implode( ',', $this->active_admin_notices ), $location );
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $protected_fields = self::get_protected_fields();
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Don't show conflicting messages like 'Post submitted.'
- if ( in_array( 1, $this->active_admin_notices ) && false !== strpos( $location, 'message=8' ) ) {
- $location = remove_query_arg( 'message', $location );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ return in_array( $field_name, $protected_fields );
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- return $location;
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * Add our custom admin notice keys to the redirect URL.
+ *
+ * Any member can add a key to $this->active_admin_notices to signify that the corresponding message should
+ * be shown when the redirect finished. When it does, print_admin_notices() will examine the URL and create
+ * a notice with the message that corresponds to the key.
+ *
+ * @param $location
+ * @param $post_id
+ * @return string
+ */
+ public function add_admin_notices_to_redirect_url( $location, $post_id ) {
+ if ( $this->active_admin_notices ) {
+ $location = add_query_arg( 'wcpt_messages', implode( ',', $this->active_admin_notices ), $location );
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * Create admin notices for messages that were passed in the URL.
- *
- * Any member can add a key to $this->active_admin_notices to signify that the corresponding message should
- * be shown when the redirect finished. add_admin_notices_to_redirect_url() adds those keys to the redirect
- * url, and this function examines the URL and create a notice with the message that corresponds to the key.
- *
- * $notices[key]['type'] should equal 'error' or 'updated'.
- */
- public function print_admin_notices() {
- global $post;
- $screen = get_current_screen();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Don't show conflicting messages like 'Post submitted.'
+ if ( in_array( 1, $this->active_admin_notices ) && false !== strpos( $location, 'message=8' ) ) {
+ $location = remove_query_arg( 'message', $location );
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( empty( $post->post_type ) || WCPT_POST_TYPE_ID != $post->post_type || 'post' !== $screen->base ) {
- return;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ return $location;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- $notices = array(
- 1 => array(
- 'type' => 'error',
- 'notice' => sprintf(
- __( 'This WordCamp cannot be moved to Needs Site until all of its required metadata is filled in: %s.', 'wordcamporg' ),
- implode( ', ', $this->get_required_fields( 'needs-site' ) )
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * Create admin notices for messages that were passed in the URL.
+ *
+ * Any member can add a key to $this->active_admin_notices to signify that the corresponding message should
+ * be shown when the redirect finished. add_admin_notices_to_redirect_url() adds those keys to the redirect
+ * url, and this function examines the URL and create a notice with the message that corresponds to the key.
+ *
+ * $notices[key]['type'] should equal 'error' or 'updated'.
+ */
+ public function print_admin_notices() {
+ global $post;
+ $screen = get_current_screen();
+
+ if ( empty( $post->post_type ) || WCPT_POST_TYPE_ID != $post->post_type || 'post' !== $screen->base ) {
+ return;
+ }
+
+ $notices = array(
+ 1 => array(
+ 'type' => 'error',
+ 'notice' => sprintf(
+ __( 'This WordCamp cannot be moved to Needs Site until all of its required metadata is filled in: %s.', 'wordcamporg' ),
+ implode( ', ', $this->get_required_fields( 'needs-site' ) )
+ ),
</ins><span class="cx" style="display: block; padding: 0 10px"> ),
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- ),
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- 3 => array(
- 'type' => 'error',
- 'notice' => sprintf(
- __( 'This WordCamp cannot be added to the schedule until all of its required metadata is filled in: %s.', 'wordcamporg' ),
- implode( ', ', $this->get_required_fields( 'scheduled' ) )
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ 3 => array(
+ 'type' => 'error',
+ 'notice' => sprintf(
+ __( 'This WordCamp cannot be added to the schedule until all of its required metadata is filled in: %s.', 'wordcamporg' ),
+ implode( ', ', $this->get_required_fields( 'scheduled' ) )
+ ),
</ins><span class="cx" style="display: block; padding: 0 10px"> ),
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- ),
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- 4 => array(
- 'type' => 'error',
- 'notice' => __( 'The physical address could not be geocoded, which prevents the camp from showing up in the Events Widget. Please tweak the address so that Google can parse it.', 'wordcamporg' )
- ),
- );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ 4 => array(
+ 'type' => 'error',
+ 'notice' => __( 'The physical address could not be geocoded, which prevents the camp from showing up in the Events Widget. Please tweak the address so that Google can parse it.', 'wordcamporg' ),
+ ),
+ );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Show this error permenantly, not just after updating.
- if ( ! empty( $post->{'Physical Address'} ) && empty( get_post_meta( $post->ID, '_venue_coordinates', true ) ) ) {
- $_REQUEST['wcpt_messages'] = empty( $_REQUEST['wcpt_messages'] ) ? '4' : $_REQUEST['wcpt_messages'] . ',4';
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Show this error permenantly, not just after updating.
+ if ( ! empty( $post->{'Physical Address'} ) && empty( get_post_meta( $post->ID, '_venue_coordinates', true ) ) ) {
+ $_REQUEST['wcpt_messages'] = empty( $_REQUEST['wcpt_messages'] ) ? '4' : $_REQUEST['wcpt_messages'] . ',4';
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( ! empty( $_REQUEST['wcpt_messages'] ) ) {
- $active_notices = explode( ',', $_REQUEST['wcpt_messages'] );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( ! empty( $_REQUEST['wcpt_messages'] ) ) {
+ $active_notices = explode( ',', $_REQUEST['wcpt_messages'] );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- foreach ( $active_notices as $notice_key ) {
- if ( isset( $notices[ $notice_key ] ) ) {
- ?>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ foreach ( $active_notices as $notice_key ) {
+ if ( isset( $notices[ $notice_key ] ) ) {
+ ?>
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><span class="cx" style="display: block; padding: 0 10px"> <div class="<?php echo esc_attr( $notices[ $notice_key ]['type'] ); ?>">
</span><span class="cx" style="display: block; padding: 0 10px"> <p><?php echo wp_kses( $notices[ $notice_key ]['notice'], wp_kses_allowed_html( 'post' ) ); ?></p>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <?php
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <?php
+ }
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- }
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * Render the WordCamp status meta box.
- */
- public function metabox_status( $post ) {
- require_once( WCPT_DIR . 'views/wordcamp/metabox-status.php' );
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * Get list of valid status transitions from given status
+ *
+ * @param string $status
+ *
+ * @return array
+ */
+ public static function get_valid_status_transitions( $status ) {
+ return WordCamp_Loader::get_valid_status_transitions( $status );
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * Render the WordCamp status meta box.
- */
- public function original_application_metabox( $post ) {
- $application_data = get_post_meta( $post->ID, '_application_data', true );
- require_once( WCPT_DIR . 'views/wordcamp/metabox-original-application.php' );
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * Get list of all available post statuses.
+ *
+ * @return array
+ */
+ public static function get_post_statuses() {
+ return WordCamp_Loader::get_post_statuses();
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * Schedule cron jobs
- */
- public function schedule_cron_jobs() {
- if ( wp_next_scheduled( 'wcpt_close_wordcamps_after_event' ) ) {
- return;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * Capability required to edit wordcamp posts
+ *
+ * @return string
+ */
+ public static function get_edit_capability() {
+ return 'wordcamp_wrangle_wordcamps';
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- wp_schedule_event( current_time( 'timestamp' ), 'hourly', 'wcpt_close_wordcamps_after_event' );
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * Schedule cron jobs
+ */
+ public function schedule_cron_jobs() {
+ if ( wp_next_scheduled( 'wcpt_close_wordcamps_after_event' ) ) {
+ return;
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * Set WordCamp posts to the Closed status after the event is over
- */
- public function close_wordcamps_after_event() {
- $scheduled_wordcamps = get_posts( array(
- 'post_type' => WCPT_POST_TYPE_ID,
- 'post_status' => 'wcpt-scheduled',
- 'posts_per_page' => -1
- ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ wp_schedule_event( current_time( 'timestamp' ), 'hourly', 'wcpt_close_wordcamps_after_event' );
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- foreach ( $scheduled_wordcamps as $wordcamp ) {
- $start_date = get_post_meta( $wordcamp->ID, 'Start Date (YYYY-mm-dd)', true );
- $end_date = get_post_meta( $wordcamp->ID, 'End Date (YYYY-mm-dd)', true );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+ * Set WordCamp posts to the Closed status after the event is over
+ */
+ public function close_wordcamps_after_event() {
+ $scheduled_wordcamps = get_posts(
+ array(
+ 'post_type' => WCPT_POST_TYPE_ID,
+ 'post_status' => 'wcpt-scheduled',
+ 'posts_per_page' => -1,
+ )
+ );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( empty( $start_date ) ) {
- continue;
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ foreach ( $scheduled_wordcamps as $wordcamp ) {
+ $start_date = get_post_meta( $wordcamp->ID, 'Start Date (YYYY-mm-dd)', true );
+ $end_date = get_post_meta( $wordcamp->ID, 'End Date (YYYY-mm-dd)', true );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( empty( $end_date ) ) {
- $end_date = $start_date;
- }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( empty( $start_date ) ) {
+ continue;
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- $end_date_at_midnight = strtotime( '23:59', $end_date ); // $end_date is the date at time 00:00, but the event isn't over until 23:59
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( empty( $end_date ) ) {
+ $end_date = $start_date;
+ }
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( $end_date_at_midnight > time() ) {
- continue;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $end_date_at_midnight = strtotime( '23:59', $end_date ); // $end_date is the date at time 00:00, but the event isn't over until 23:59
+
+ if ( $end_date_at_midnight > time() ) {
+ continue;
+ }
+
+ wp_update_post(
+ array(
+ 'ID' => $wordcamp->ID,
+ 'post_status' => 'wcpt-closed',
+ )
+ );
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-
- wp_update_post( array(
- 'ID' => $wordcamp->ID,
- 'post_status' => 'wcpt-closed',
- ) );
</del><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-}
</del><span class="cx" style="display: block; padding: 0 10px"> endif; // class_exists check
</span><span class="cx" style="display: block; padding: 0 10px">
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1214,96 +1073,6 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 'Global Sponsorship Grant' => 'Deprecated.',
</span><span class="cx" style="display: block; padding: 0 10px"> );
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- foreach ( $meta_keys as $key => $value ) :
- $object_name = wcpt_key_to_str( $key, 'wcpt_' );
- $readonly = ( WordCamp_Admin::is_protected_field( $key ) ) ? ' readonly="readonly"' : '';
- ?>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ Event_Admin::display_meta_boxes( $required_fields, $meta_keys, $messages, $post_id, WordCamp_Admin::get_protected_fields() );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <div class="inside">
- <?php if ( 'checkbox' == $value ) : ?>
-
- <p>
- <strong><?php echo $key; ?></strong>:
- <input type="checkbox" name="<?php echo $object_name; ?>" id="<?php echo $object_name; ?>" <?php checked( get_post_meta( $post_id, $key, true ) ); ?><?php echo $readonly; ?> />
- </p>
-
- <?php else : ?>
-
- <p>
- <strong><?php echo $key; ?></strong>
- <?php if ( in_array( $key, $required_fields, true ) ) : ?>
- <span class="description"><?php _e( '(required)', 'wordcamporg' ); ?></span>
- <?php endif; ?>
- </p>
-
- <p>
- <label class="screen-reader-text" for="<?php echo $object_name; ?>"><?php echo $key; ?></label>
-
- <?php switch ( $value ) :
- case 'text' : ?>
-
- <input type="text" size="36" name="<?php echo $object_name; ?>" id="<?php echo $object_name; ?>" value="<?php echo esc_attr( get_post_meta( $post_id, $key, true ) ); ?>"<?php echo $readonly; ?> />
-
- <?php break;
- case 'number' : ?>
-
- <input type="number" size="16" name="<?php echo $object_name; ?>" id="<?php echo $object_name; ?>" value="<?php echo esc_attr( get_post_meta( $post_id, $key, true ) ); ?>" step="any" min="0"<?php echo $readonly; ?> />
-
- <?php break;
- case 'date' :
-
- // Quick filter on dates
- if ( $date = get_post_meta( $post_id, $key, true ) ) {
- $date = date( 'Y-m-d', $date );
- }
-
- ?>
-
- <input type="text" size="36" class="date-field" name="<?php echo $object_name; ?>" id="<?php echo $object_name; ?>" value="<?php echo $date; ?>"<?php echo $readonly; ?> />
-
- <?php break;
- case 'textarea' : ?>
-
- <textarea rows="4" cols="23" name="<?php echo $object_name; ?>" id="<?php echo $object_name; ?>"<?php echo $readonly; ?>><?php echo esc_attr( get_post_meta( $post_id, $key, true ) ); ?></textarea>
-
- <?php break;
- case 'select-currency' :
- $currencies = WordCamp_Budgets::get_currencies(); ?>
-
- <?php if ( $readonly ) :
- $value = get_post_meta( $post_id, $key, true ); ?>
- <select name="<?php echo $object_name; ?>" id="<?php echo $object_name; ?>"<?php echo $readonly; ?>>
- <option value="<?php echo esc_attr( $value ); ?>" selected>
- <?php echo ( $value ) ? esc_html( $currencies[ $value ] . ' (' . $value . ')' ) : ''; ?>
- </option>
- </select>
- <?php else : ?>
- <select name="<?php echo esc_attr( $object_name ); ?>" id="<?php echo esc_attr( $object_name ); ?>" class="select-currency">
- <?php foreach ( $currencies as $symbol => $name ) : ?>
- <option value="<?php echo esc_attr( $symbol ); ?>"<?php selected( $symbol, get_post_meta( $post_id, $key, true ) ); ?>>
- <?php echo ( $symbol ) ? esc_html( $name . ' (' . $symbol . ')' ) : ''; ?>
- </option>
- <?php endforeach; ?>
- </select>
- <?php endif; ?>
-
- <?php break;
-
- default:
- do_action( 'wcpt_metabox_value', $key, $value, $object_name );
- break;
-
- endswitch; ?>
-
- <?php if ( ! empty( $messages[ $key ] ) ) : ?>
- <?php if ( 'textarea' == $value ) { echo '<br />'; } ?>
-
- <span class="description"><?php echo esc_html( $messages[ $key ] ); ?></span>
- <?php endif; ?>
- </p>
-
- <?php endif; ?>
- </div>
-
- <?php endforeach;
</del><span class="cx" style="display: block; padding: 0 10px"> }
</span></span></pre></div>
<a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcptwordcampwordcamploaderphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-wordcamp/wordcamp-loader.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-wordcamp/wordcamp-loader.php 2018-08-13 07:28:19 UTC (rev 7606)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-wordcamp/wordcamp-loader.php 2018-08-13 11:52:14 UTC (rev 7607)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -6,6 +6,8 @@
</span><span class="cx" style="display: block; padding: 0 10px"> define( 'WCPT_DEFAULT_STATUS', 'wcpt-needs-vetting' );
</span><span class="cx" style="display: block; padding: 0 10px"> define( 'WCPT_FINAL_STATUS', 'wcpt-closed' );
</span><span class="cx" style="display: block; padding: 0 10px">
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+require_once WCPT_DIR . 'wcpt-event/class-event-loader.php';
+
</ins><span class="cx" style="display: block; padding: 0 10px"> if ( ! class_exists( 'WordCamp_Loader' ) ) :
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span><span class="cx" style="display: block; padding: 0 10px"> * WordCamp_Loader
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -15,17 +17,13 @@
</span><span class="cx" style="display: block; padding: 0 10px"> * @since WordCamp Post Type (0.1)
</span><span class="cx" style="display: block; padding: 0 10px"> *
</span><span class="cx" style="display: block; padding: 0 10px"> */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-class WordCamp_Loader {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+class WordCamp_Loader extends Event_Loader {
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span><span class="cx" style="display: block; padding: 0 10px"> * The main WordCamp Post Type loader
</span><span class="cx" style="display: block; padding: 0 10px"> */
</span><span class="cx" style="display: block; padding: 0 10px"> function __construct() {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- add_action( 'plugins_loaded', array( $this, 'includes' ) );
- add_action( 'init', array( $this, 'register_post_types' ) );
- add_action( 'init', array( $this, 'register_post_capabilities' ) );
- add_action( 'init', array( $this, 'register_post_statuses' ) );
- add_filter( 'pre_get_posts', array( $this, 'query_public_statuses_on_archives' ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ parent::__construct();
</ins><span class="cx" style="display: block; padding: 0 10px"> add_action( 'wp_insert_post_data', array( $this, 'set_scheduled_date' ) );
</span><span class="cx" style="display: block; padding: 0 10px"> add_filter( 'wordcamp_rewrite_rules', array( $this, 'wordcamp_rewrite_rules' ) );
</span><span class="cx" style="display: block; padding: 0 10px"> add_filter( 'query_vars', array( $this, 'query_vars' ) );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -131,53 +129,8 @@
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- public function register_post_statuses() {
- foreach ( self::get_post_statuses() as $key => $label ) {
- register_post_status( $key, array(
- 'label' => $label,
- 'public' => true,
- 'label_count' => _nx_noop(
- sprintf( '%s <span class="count">(%s)</span>', $label, '%s' ),
- sprintf( '%s <span class="count">(%s)</span>', $label, '%s' ),
- 'wordcamporg'
- ),
- ) );
- }
- }
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- /**
- * Only query the public post statuses on WordCamp archives and feeds
- *
- * By default, any public post statuses are queried when the `post_status` parameter is not explicitly passed
- * to WP_Query. This causes central.wordcamp.org/wordcamps/ and central.wordcamp.org/wordcamps/feed/ to display
- * camps that are `needs-vetting`, etc, which is not desired.
- *
- * Another way to fix this would have been to register some of the posts statuses as `private`, but they're not
- * consistently used in a public or private way, so that would have had more side effects.
- *
- * @param WP_Query $query
- */
- public function query_public_statuses_on_archives( $query ) {
- if ( ! $query->is_post_type_archive( WCPT_POST_TYPE_ID ) ) {
- return;
- }
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( is_admin() ) {
- return;
- }
-
- // Sort by the date it was added to the schedule. See WordCamp_Loader::set_scheduled_date() for details.
- if ( '' === $query->get( 'orderby' ) ) {
- $query->set( 'orderby', 'menu_order date' );
- }
-
- if ( ! empty( $query->query_vars['post_status'] ) ) {
- return;
- }
-
- $query->query_vars['post_status'] = self::get_public_post_statuses();
- }
-
</del><span class="cx" style="display: block; padding: 0 10px"> /**
</span><span class="cx" style="display: block; padding: 0 10px"> * Save the date that the camp was moved on to the official schedule
</span><span class="cx" style="display: block; padding: 0 10px"> *
</span></span></pre></div>
<a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswcptwcptwordcampwordcampphp"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-wordcamp/wordcamp.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-wordcamp/wordcamp.php (rev 0)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-wordcamp/wordcamp.php 2018-08-13 11:52:14 UTC (rev 7607)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,16 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+<?php
+
+namespace WordPress_Community\Applications\WordCamp;
+require_once 'class-wordcamp-application.php';
+use WordPress_Community\Applications\WordCamp_Application;
+
+defined( 'WPINC' ) or die();
+
+$wordcamp_application = new WordCamp_Application();
+
+add_shortcode( $wordcamp_application::SHORTCODE_SLUG, array( $wordcamp_application, 'render_application_shortcode' ) );
+
+add_action( 'wp_enqueue_scripts', array( $wordcamp_application, 'enqueue_common_assets'), 11 );
+
+add_action( 'wp_enqueue_scripts', array( $wordcamp_application, 'enqueue_assets' ) );
+
</ins><span class="cx" style="display: block; padding: 0 10px">Property changes on: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-wordcamp/wordcamp.php
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:eol-style</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+native
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span></div>
</body>
</html>