Skip to content

Commit

Permalink
Merge branch 'release/1.3.1'
Browse files Browse the repository at this point in the history
  • Loading branch information
abrain committed Aug 13, 2017
2 parents 6a424dd + 7f6398a commit 3190e6b
Show file tree
Hide file tree
Showing 13 changed files with 355 additions and 125 deletions.
11 changes: 5 additions & 6 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,17 @@ php:
- '5.6'
- '7.0'
- '7.1'
- hhvm

env:
- WP_VERSION=4.4.8 WP_MULTISITE=0
- WP_VERSION=4.5.7 WP_MULTISITE=0
- WP_VERSION=4.6.4 WP_MULTISITE=0
- WP_VERSION=4.7.3 WP_MULTISITE=0
- WP_VERSION=4.4.10 WP_MULTISITE=0
- WP_VERSION=4.5.9 WP_MULTISITE=0
- WP_VERSION=4.6.6 WP_MULTISITE=0
- WP_VERSION=4.7.5 WP_MULTISITE=0
- WP_VERSION=4.8.1 WP_MULTISITE=0
- WP_VERSION=nightly WP_MULTISITE=0

matrix:
allow_failures:
- php: hhvm
- env: WP_VERSION=nightly WP_MULTISITE=0
fast_finish: true

Expand Down
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Einsatzverwaltung
## Plugin zur Verwaltung von Feuerwehreinsätzen

[![Flattr](https://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/thing/2638688/abraineinsatzverwaltung-on-GitHub) [![Build Status](https://travis-ci.org/abrain/einsatzverwaltung.svg)](https://travis-ci.org/abrain/einsatzverwaltung) [![Code Climate](https://codeclimate.com/github/abrain/einsatzverwaltung/badges/gpa.svg)](https://codeclimate.com/github/abrain/einsatzverwaltung) [![Test Coverage](https://codeclimate.com/github/abrain/einsatzverwaltung/badges/coverage.svg)](https://codeclimate.com/github/abrain/einsatzverwaltung/coverage)
[![Build Status](https://travis-ci.org/abrain/einsatzverwaltung.svg)](https://travis-ci.org/abrain/einsatzverwaltung) [![Code Climate](https://codeclimate.com/github/abrain/einsatzverwaltung/badges/gpa.svg)](https://codeclimate.com/github/abrain/einsatzverwaltung) [![Test Coverage](https://codeclimate.com/github/abrain/einsatzverwaltung/badges/coverage.svg)](https://codeclimate.com/github/abrain/einsatzverwaltung/coverage)

Dieses Plugin fügt WordPress eine neue Beitragsart "Einsatzbericht" hinzu. Diese Einsatzberichte werden wie gewöhnliche WordPress-Beiträge erstellt, es können aber zusätzliche Informationen wie Alarmzeit, Art des Einsatzes, eingesetzte Fahrzeuge und vieles mehr angegeben werden. Zudem stellt das Plugin verschiedene Möglichkeiten zur Darstellung der Einsatzberichte zur Verfügung.

Expand All @@ -25,6 +25,8 @@ Der PHP-Code wird gemäß dem Coding Style Guide [PSR-2](http://www.php
* PHP: 5.3.0
* WordPress: 4.4

Auch wenn PHP 5.3 vorausgesetzt und derzeit noch als Minimum erhalten wird, werden die automatisierten Tests nur mit den [aktuellen PHP-Versionen](https://secure.php.net/supported-versions.php) durchgeführt.

### Social Media

* Twitter: [@einsatzvw](https://twitter.com/einsatzvw)
Expand Down
152 changes: 94 additions & 58 deletions src/Import/Helper.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
namespace abrain\Einsatzverwaltung\Import;

use abrain\Einsatzverwaltung\Core;
use abrain\Einsatzverwaltung\Data;
use abrain\Einsatzverwaltung\Import\Sources\AbstractSource;
use abrain\Einsatzverwaltung\Model\IncidentReport;
use abrain\Einsatzverwaltung\Options;
Expand All @@ -28,17 +29,24 @@ class Helper
*/
private $options;

/**
* @var Data
*/
private $data;

/**
* Helper constructor.
* @param Utilities $utilities
* @param Core $core
* @param Options $options
* @param Data $data
*/
public function __construct(Utilities $utilities, Core $core, Options $options)
public function __construct(Utilities $utilities, Core $core, Options $options, Data $data)
{
$this->utilities = $utilities;
$this->core = $core;
$this->options = $options;
$this->data = $data;
}


Expand Down Expand Up @@ -95,12 +103,24 @@ private function dropdownEigeneFelder($args)
*/
public function import($source, $mapping)
{
set_time_limit(0); // Zeitlimit deaktivieren

$sourceEntries = $source->getEntries(array_keys($mapping));
if (empty($sourceEntries)) {
$this->utilities->printError('Die Importquelle lieferte keine Ergebnisse. Entweder sind dort keine Einsätze gespeichert oder es gab ein Problem bei der Abfrage.');
return;
}

// Der Veröffentlichungsstatus der importierten Berichte
$postStatus = $source->isPublishReports() ? 'publish' : 'draft';

// Für die Dauer des Imports sollen die laufenden Nummern nicht aktuell gehalten werden, da dies die Performance
// stark beeinträchtigt
if ('publish' === $postStatus) {
$this->data->pauseAutoSequenceNumbers();
}
$yearsImported = array();

$dateFormat = $source->getDateFormat();
$timeFormat = $source->getTimeFormat();
if (!empty($dateFormat) && !empty($timeFormat)) {
Expand All @@ -110,74 +130,77 @@ public function import($source, $mapping)
$dateTimeFormat = 'Y-m-d H:i';
}

$metaFields = IncidentReport::getMetaFields();
$ownTerms = IncidentReport::getTerms();
$postFields = IncidentReport::getPostFields();

foreach ($sourceEntries as $sourceEntry) {
$metaValues = array();
$insertArgs = array();
$insertArgs['post_content'] = '';
$insertArgs['tax_input'] = array();
$ownTerms = IncidentReport::getTerms();
$postFields = IncidentReport::getPostFields();

foreach ($mapping as $sourceField => $ownField) {
if (!empty($ownField) && is_string($ownField)) {
$sourceValue = trim($sourceEntry[$sourceField]);
if (array_key_exists($ownField, IncidentReport::getMetaFields())) {
// Wert gehört in ein Metafeld
$metaValues[$ownField] = $sourceValue;
} elseif (array_key_exists($ownField, $ownTerms)) {
// Wert gehört zu einer Taxonomie
if (empty($sourceValue)) {
// Leere Terms überspringen
continue;
}
if (is_taxonomy_hierarchical($ownField)) {
// Bei hierarchischen Taxonomien muss die ID statt des Namens verwendet werden
$termIds = array();

$termNames = explode(',', $sourceValue);
foreach ($termNames as $termName) {
$termName = trim($termName);
$term = get_term_by('name', $termName, $ownField);

if ($term !== false) {
// Term existiert bereits, ID verwenden
$termIds[] = $term->term_id;
continue;
}

// Term existiert in dieser Taxonomie noch nicht, neu anlegen
$newterm = wp_insert_term($termName, $ownField);
if (is_wp_error($newterm)) {
$this->utilities->printError(
sprintf(
"Konnte %s '%s' nicht anlegen: %s",
$ownTerms[$ownField]['label'],
$termName,
$newterm->get_error_message()
)
);
continue;
}

// Anlegen erfolgreich, zurückgegebene ID verwenden
$termIds[] = $newterm['term_id'];
if (empty($ownField) || !is_string($ownField)) {
$this->utilities->printError("Feld '$ownField' ungültig");
continue;
}

$sourceValue = trim($sourceEntry[$sourceField]);
if (array_key_exists($ownField, $metaFields)) {
// Wert gehört in ein Metafeld
$metaValues[$ownField] = $sourceValue;
} elseif (array_key_exists($ownField, $ownTerms)) {
// Wert gehört zu einer Taxonomie
if (empty($sourceValue)) {
// Leere Terms überspringen
continue;
}
if (is_taxonomy_hierarchical($ownField)) {
// Bei hierarchischen Taxonomien muss die ID statt des Namens verwendet werden
$termIds = array();

$termNames = explode(',', $sourceValue);
foreach ($termNames as $termName) {
$termName = trim($termName);
$term = get_term_by('name', $termName, $ownField);

if ($term !== false) {
// Term existiert bereits, ID verwenden
$termIds[] = $term->term_id;
continue;
}

// Term existiert in dieser Taxonomie noch nicht, neu anlegen
$newterm = wp_insert_term($termName, $ownField);
if (is_wp_error($newterm)) {
$this->utilities->printError(
sprintf(
"Konnte %s '%s' nicht anlegen: %s",
$ownTerms[$ownField]['label'],
$termName,
$newterm->get_error_message()
)
);
continue;
}

$insertArgs['tax_input'][$ownField] = implode(',', $termIds);
} else {
// Name kann direkt verwendet werden
$insertArgs['tax_input'][$ownField] = $sourceValue;
// Anlegen erfolgreich, zurückgegebene ID verwenden
$termIds[] = $newterm['term_id'];
}
} elseif (array_key_exists($ownField, $postFields)) {
// Wert gehört direkt zum Post
$insertArgs[$ownField] = $sourceValue;
} elseif ($ownField == '-') {
$this->utilities->printWarning("Feld '$sourceField' nicht zugeordnet");

$insertArgs['tax_input'][$ownField] = implode(',', $termIds);
} else {
$this->utilities->printError("Feld '$ownField' unbekannt");
// Name kann direkt verwendet werden
$insertArgs['tax_input'][$ownField] = $sourceValue;
}
} elseif (array_key_exists($ownField, $postFields)) {
// Wert gehört direkt zum Post
$insertArgs[$ownField] = $sourceValue;
} elseif ($ownField == '-') {
$this->utilities->printWarning("Feld '$sourceField' nicht zugeordnet");
} else {
$this->utilities->printError("Feld '$ownField' ungültig");
$this->utilities->printError("Feld '$ownField' unbekannt");
}
}

Expand All @@ -193,6 +216,7 @@ public function import($source, $mapping)
);
continue;
}
$yearsImported[$alarmzeit->format('Y')] = 1;

$insertArgs['post_date'] = $alarmzeit->format('Y-m-d H:i');
$insertArgs['post_date_gmt'] = get_gmt_from_date($insertArgs['post_date']);
Expand All @@ -215,7 +239,7 @@ public function import($source, $mapping)
}

$insertArgs['post_type'] = 'einsatz';
$insertArgs['post_status'] = 'publish';
$insertArgs['post_status'] = $postStatus;

// Titel sicherstellen
if (!array_key_exists('post_title', $insertArgs)) {
Expand Down Expand Up @@ -243,6 +267,17 @@ public function import($source, $mapping)
}
}

if ('publish' === $postStatus) {
// Die automatische Aktualisierung der laufenden Nummern wird wieder aufgenommen
$this->utilities->printSuccess('Die Berichte wurden importiert');
$this->utilities->printInfo('Metadaten werden aktualisiert ...');
flush();
$this->data->resumeAutoSequenceNumbers();
foreach (array_keys($yearsImported) as $year) {
$this->data->updateSequenceNumbers(strval($year));
}
}

$this->utilities->printSuccess('Der Import ist abgeschlossen');
echo '<a href="edit.php?post_type=einsatz">Zu den Einsatzberichten</a>';
}
Expand Down Expand Up @@ -335,11 +370,12 @@ public function validateMapping($mapping, $source)
}

$unmatchableFields = $source->getUnmatchableFields();
$autoMatchFields = $source->getAutoMatchFields();
if ($this->options->isAutoIncidentNumbers()) {
$unmatchableFields[] = 'einsatz_incidentNumber';
}
foreach ($unmatchableFields as $unmatchableField) {
if (in_array($unmatchableField, $mapping)) {
if (in_array($unmatchableField, $mapping) && !in_array($unmatchableField, $autoMatchFields)) {
$this->utilities->printError(sprintf(
'Feld %s kann nicht f&uuml;r ein zu importierendes Feld als Ziel angegeben werden',
esc_html($unmatchableField)
Expand Down
18 changes: 18 additions & 0 deletions src/Import/Sources/AbstractSource.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,12 @@ public function echoExtraFormFields($nextAction)
return;
}

echo '<h3>Allgemeine Einstellungen</h3>';
echo '<label><input type="checkbox" name="import_publish_reports" value="1" ';
checked($this->args['import_publish_reports'], '1');
echo ' /> Einsatzberichte sofort ver&ouml;ffentlichen</label>';
echo '<p class="description">Das Setzen dieser Option verl&auml;ngert die Importzeit deutlich, Benutzung auf eigene Gefahr. Standardm&auml;&szlig;ig werden die Berichte als Entwurf importiert.</p>';

foreach ($nextAction['args'] as $arg) {
if (array_key_exists($arg, $this->args)) {
echo '<input type="hidden" name="'.$arg.'" value="' . $this->args[$arg] . '" />';
Expand Down Expand Up @@ -227,6 +233,18 @@ public function getUnmatchableFields()
return array_merge(array_values($this->autoMatchFields), $this->internalFields);
}

/**
* @return bool
*/
public function isPublishReports()
{
if (!array_key_exists('import_publish_reports', $this->args)) {
return false;
}

return 1 === $this->args['import_publish_reports'];
}

/**
* Setzt ein Argument in der Importquelle
*
Expand Down
20 changes: 17 additions & 3 deletions src/Import/Tool.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
namespace abrain\Einsatzverwaltung\Import;

use abrain\Einsatzverwaltung\Core;
use abrain\Einsatzverwaltung\Data;
use abrain\Einsatzverwaltung\Import\Sources\AbstractSource;
use abrain\Einsatzverwaltung\Import\Sources\Csv;
use abrain\Einsatzverwaltung\Import\Sources\WpEinsatz;
Expand Down Expand Up @@ -53,20 +54,27 @@ class Tool
*/
private $options;

/**
* @var Data
*/
private $data;

/**
* Konstruktor
*
* @param Core $core
* @param Utilities $utilities
* @param Options $options
* @param Data $data
*/
public function __construct($core, $utilities, $options)
public function __construct($core, $utilities, $options, $data)
{
$this->core = $core;
$this->utilities = $utilities;
$this->options = $options;
$this->addHooks();
$this->loadSources();
$this->data = $data;
}

private function addHooks()
Expand Down Expand Up @@ -125,7 +133,7 @@ private function loadSources()
public function renderToolPage()
{
require_once dirname(__FILE__) . '/Helper.php';
$this->helper = new Helper($this->utilities, $this->core, $this->options);
$this->helper = new Helper($this->utilities, $this->core, $this->options, $this->data);

echo '<div class="wrap">';
echo '<h1>' . 'Einsatzberichte importieren' . '</h1>';
Expand Down Expand Up @@ -169,7 +177,7 @@ public function renderToolPage()
$this->currentAction = $this->currentSource->getAction($aktion);
$this->nextAction = $this->currentSource->getNextAction($this->currentAction);

// Einstellungen an die Imortquelle übergeben
// Einstellungen an die Importquelle übergeben
if (array_key_exists('args', $this->currentAction) && is_array($this->currentAction['args'])) {
foreach ($this->currentAction['args'] as $arg) {
$value = (array_key_exists($arg, $_POST) ? sanitize_text_field($_POST[$arg]) : null);
Expand All @@ -188,6 +196,12 @@ public function renderToolPage()
}
}

// Datums- und Zeitformat für CSV-Import übernehmen
$this->currentSource->putArg(
'import_publish_reports',
$this->utilities->sanitizeCheckbox(array($_POST, 'import_publish_reports'))
);

echo "<h2>{$this->currentAction['name']}</h2>";

// TODO gemeinsame Prüfungen auslagern
Expand Down
1 change: 1 addition & 0 deletions src/TasksPage.php
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ public function renderPage()

switch ($action) {
case 'regenerate-slugs':
set_time_limit(0); // Zeitlimit deaktivieren
$posts = get_posts(array(
'nopaging' => true,
'orderby' => 'post_date',
Expand Down
Loading

0 comments on commit 3190e6b

Please sign in to comment.