mirror of
https://github.com/snipe/snipe-it.git
synced 2024-12-25 21:54:14 -08:00
99cc8293ef
* Refactored AssetsTransformer Casted all ids to int, escaped all text values, * Added warranty_expires attribute to Asset model $asset->warranty_expires contains a Carbon object with the warranty expiration date. Returns null when either purchase_date or warranty_months are not set. * Ignoring php-cs cache files * Restored asset tests expectations Work in progress - tests still fail * API controller refactoring, fixed HTTP status codes in responses * Restored $request->get - debugging * Added further checks in ApiAssetsCest::updateAssetWithPatch * Fixed undefined method * Fixed initial underscore trimmed by str_slug * CustomFieldTest now works where intl PHP extension is not installed If a server doesn't have the intl php extension installed, the custom fields tests failed. Now the tests perform the same check done in the CustomField class.
178 lines
5.3 KiB
PHP
178 lines
5.3 KiB
PHP
<?php
|
|
namespace App\Models;
|
|
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Schema;
|
|
use Watson\Validating\ValidatingTrait;
|
|
use App\Http\Traits\UniqueUndeletedTrait;
|
|
use ForceUTF8\Encoding;
|
|
use EasySlugger\Utf8Slugger;
|
|
use Patchwork\Utf8;
|
|
|
|
class CustomField extends Model
|
|
{
|
|
use ValidatingTrait, UniqueUndeletedTrait;
|
|
public $guarded=["id"];
|
|
public static $PredefinedFormats=[
|
|
"ANY" => "",
|
|
"ALPHA" => "alpha",
|
|
"EMAIL" => "email",
|
|
"DATE" => "date",
|
|
"URL" => "url",
|
|
"NUMERIC" => "numeric",
|
|
"MAC" => "regex:/^[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}$/",
|
|
"IP" => "ip",
|
|
];
|
|
|
|
public $rules = [
|
|
"name" => "required|unique:custom_fields"
|
|
];
|
|
|
|
public static $table_name="assets";
|
|
|
|
public static function name_to_db_name($name)
|
|
{
|
|
return "_snipeit_" . preg_replace("/[^a-zA-Z0-9]/", "_", strtolower($name));
|
|
}
|
|
|
|
public static function boot()
|
|
{
|
|
self::created(function ($custom_field) {
|
|
\Log::debug("\n\nCreating Original Name: ".$custom_field->name);
|
|
\Log::debug('Creating Column Name: '.$custom_field->convertUnicodeDbSlug());
|
|
|
|
|
|
if (Schema::hasColumn(CustomField::$table_name, $custom_field->convertUnicodeDbSlug())) {
|
|
\Log::debug('Column exists. Nothing to do here.');
|
|
return false;
|
|
}
|
|
|
|
Schema::table(CustomField::$table_name, function ($table) use ($custom_field) {
|
|
$table->text($custom_field->convertUnicodeDbSlug())->nullable();
|
|
});
|
|
|
|
$custom_field->db_column = $custom_field->convertUnicodeDbSlug();
|
|
$custom_field->save();
|
|
});
|
|
|
|
|
|
self::updating(function ($custom_field) {
|
|
\Log::debug('Updating column name');
|
|
\Log::debug('Updating Original Name: '.$custom_field->getOriginal("name"));
|
|
\Log::debug('Updating New Column Name: '.$custom_field->convertUnicodeDbSlug());
|
|
|
|
if ($custom_field->isDirty("name")) {
|
|
if (Schema::hasColumn(CustomField::$table_name, $custom_field->convertUnicodeDbSlug())) {
|
|
\Log::debug('Column already exists. Nothing to update.');
|
|
return true;
|
|
}
|
|
|
|
\Log::debug('Updating column name to.'.$custom_field->convertUnicodeDbSlug());
|
|
|
|
return Schema::table(CustomField::$table_name, function ($table) use ($custom_field) {
|
|
$table->renameColumn($custom_field->convertUnicodeDbSlug($custom_field->getOriginal("name")), $custom_field->convertUnicodeDbSlug());
|
|
});
|
|
}
|
|
return true;
|
|
});
|
|
|
|
self::deleting(function ($custom_field) {
|
|
return Schema::table(CustomField::$table_name, function ($table) use ($custom_field) {
|
|
$table->dropColumn($custom_field->convertUnicodeDbSlug());
|
|
});
|
|
});
|
|
}
|
|
|
|
public function fieldset()
|
|
{
|
|
return $this->belongsToMany('\App\Models\CustomFieldset'); //?!?!?!?!?!?
|
|
}
|
|
|
|
public function user()
|
|
{
|
|
return $this->belongsTo('\App\Models\User');
|
|
}
|
|
|
|
|
|
public function check_format($value)
|
|
{
|
|
return preg_match('/^'.$this->attributes['format'].'$/', $value)===1;
|
|
}
|
|
|
|
public function db_column_name()
|
|
{
|
|
return self::convertUnicodeDbSlug();
|
|
}
|
|
|
|
//mutators for 'format' attribute
|
|
public function getFormatAttribute($value)
|
|
{
|
|
foreach (self::$PredefinedFormats as $name => $pattern) {
|
|
if ($pattern===$value) {
|
|
return $name;
|
|
}
|
|
}
|
|
return $value;
|
|
}
|
|
|
|
public function setFormatAttribute($value)
|
|
{
|
|
if (isset(self::$PredefinedFormats[$value])) {
|
|
$this->attributes['format']=self::$PredefinedFormats[$value];
|
|
} else {
|
|
$this->attributes['format']=$value;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Format a value string as an array for select boxes and checkboxes.
|
|
*
|
|
* @author [A. Gianotto] [<snipe@snipe.net>]
|
|
* @since [v3.4]
|
|
* @return Array
|
|
*/
|
|
public function formatFieldValuesAsArray()
|
|
{
|
|
$arr = preg_split("/\\r\\n|\\r|\\n/", $this->field_values);
|
|
|
|
$result[''] = 'Select '.strtolower($this->format);
|
|
|
|
for ($x = 0; $x < count($arr); $x++) {
|
|
$arr_parts = explode('|', $arr[$x]);
|
|
if ($arr_parts[0]!='') {
|
|
if (key_exists('1', $arr_parts)) {
|
|
$result[$arr_parts[0]] = $arr_parts[1];
|
|
} else {
|
|
$result[$arr_parts[0]] = $arr_parts[0];
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
return $result;
|
|
}
|
|
|
|
public function isFieldDecryptable($string)
|
|
{
|
|
if (($this->field_encrypted=='1') && ($string!='')) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
public function convertUnicodeDbSlug($original = null)
|
|
{
|
|
$name = $original ? $original : $this->name;
|
|
$id = $this->id ? $this->id : 'xx';
|
|
|
|
if (!function_exists('transliterator_transliterate')) {
|
|
$long_slug = '_snipeit_' . str_slug(\Patchwork\Utf8::utf8_encode(trim($name)), '_');
|
|
} else {
|
|
$long_slug = '_snipeit_' . Utf8Slugger::slugify($name, '_');
|
|
}
|
|
|
|
return substr($long_slug, 0, 50) . '_' . $id;
|
|
}
|
|
}
|