From aa7091d9624b8c2557e702bde0b738cfb75856c7 Mon Sep 17 00:00:00 2001 From: snipe Date: Tue, 17 Oct 2017 20:04:07 -0700 Subject: [PATCH 1/7] Fixes #4226 - adds log_max_files to app config and sample env --- .env.example | 3 ++- app/Providers/AppServiceProvider.php | 4 +-- config/app.php | 37 ++++++++++++++++++++++++++-- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/.env.example b/.env.example index 2a34e9ae2..51f9e3e5b 100644 --- a/.env.example +++ b/.env.example @@ -97,7 +97,8 @@ LOGIN_LOCKOUT_DURATION=60 # -------------------------------------------- # OPTIONAL: MISC # -------------------------------------------- -APP_LOG=single +APP_LOG=daily +APP_LOG_MAX_FILES=10 APP_LOCKED=false FILESYSTEM_DISK=local APP_TRUSTED_PROXIES=192.168.1.1,10.0.0.1 diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 0e885f104..9aea69bec 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -98,8 +98,8 @@ class AppServiceProvider extends ServiceProvider if (config('app.debug')) { $log_level = 'debug'; } else { - if (config('log-level')) { - $log_level = config('log-level'); + if (config('app.log_level')) { + $log_level = config('app.log_level'); } else { $log_level = 'error'; } diff --git a/config/app.php b/config/app.php index 6c9c471a5..08befc236 100755 --- a/config/app.php +++ b/config/app.php @@ -121,8 +121,41 @@ return [ | */ - 'log' => env('APP_LOG', 'single'), - 'log-level' => env('APP_LOG_LEVEL', 'error'), + 'log' => env('APP_LOG', 'daily'), + + /* + |-------------------------------------------------------------------------- + | Logging Max Files + |-------------------------------------------------------------------------- + | + | When using the daily log mode, Laravel will only retain 5 + | days of log files by default. + | + | To change this, set the APP_LOG_MAX_FILES option in your .env. + | + */ + + 'log_max_files' => env('APP_LOG_MAX_FILES', 5), + + /* + |-------------------------------------------------------------------------- + | Logging Detail + |-------------------------------------------------------------------------- + | + | By default, Laravel writes all log levels to storage. However, in your + | production environment, you may wish to configure the minimum severity that + | should be logged by editing your APP_LOG_LEVEL env config. + | + | Laravel will log all levels greater than or equal to the specified severity. + | For example, a default log_level of error will log error, critical, alert, + | and emergency messages. + | + | APP_LOG_LEVEL options are: + | "debug", "info", "notice", "warning", "error", "critical", "alert", "emergency" + | + */ + + 'log_level' => env('APP_LOG_LEVEL', 'error'), /* From 665a113ed8185d917d0e68089c9377a74b876aff Mon Sep 17 00:00:00 2001 From: Geoff Young Date: Tue, 17 Oct 2017 23:39:49 -0400 Subject: [PATCH 2/7] Update account history query (#4237) This will limit the action_log records displayed when a user is viewing their own assets and history since both target_type and target_id must be set for a where condition to be added to the history query. --- resources/views/account/view-assets.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/account/view-assets.blade.php b/resources/views/account/view-assets.blade.php index a6eb89245..0ba077919 100755 --- a/resources/views/account/view-assets.blade.php +++ b/resources/views/account/view-assets.blade.php @@ -230,7 +230,7 @@ View Assets for {{ $user->present()->fullName() }} id="table" data-cookie="false" data-cookie-id-table="userHistoryTable-{{ config('version.hash_version') }}" - data-url="{{route('api.activity.index', ['user_id' => $user->id, 'order' => 'desc']) }}"> + data-url="{{route('api.activity.index', ['target_id' => $user->id, 'target_type' => 'User', 'order' => 'desc']) }}"> From c069829b331cc070bb59e5b0c0d979f1d3e47d19 Mon Sep 17 00:00:00 2001 From: snipe Date: Tue, 17 Oct 2017 21:43:57 -0700 Subject: [PATCH 3/7] Fixes #906 - groups view --- app/Http/Controllers/Api/UsersController.php | 5 +- app/Http/Controllers/GroupsController.php | 33 ++++++- app/Models/User.php | 8 ++ resources/views/groups/index.blade.php | 2 +- resources/views/groups/view.blade.php | 93 ++++++++++--------- .../views/partials/bootstrap-table.blade.php | 15 +++ resources/views/users/index.blade.php | 15 --- resources/views/users/view.blade.php | 1 - routes/web.php | 10 +- 9 files changed, 112 insertions(+), 70 deletions(-) diff --git a/app/Http/Controllers/Api/UsersController.php b/app/Http/Controllers/Api/UsersController.php index 65338723c..f3be10cf7 100644 --- a/app/Http/Controllers/Api/UsersController.php +++ b/app/Http/Controllers/Api/UsersController.php @@ -57,7 +57,6 @@ class UsersController extends Controller $users = $users->GetDeleted(); } - if ($request->has('company_id')) { $users = $users->where('company_id', '=', $request->input('company_id')); } @@ -65,6 +64,10 @@ class UsersController extends Controller if ($request->has('location_id')) { $users = $users->where('location_id', '=', $request->input('location_id')); } + + if ($request->has('group_id')) { + $users = $users->ByGroup($request->has('group_id')); + } if ($request->has('department_id')) { $users = $users->where('department_id','=',$request->input('department_id')); diff --git a/app/Http/Controllers/GroupsController.php b/app/Http/Controllers/GroupsController.php index c2519fcc6..fabccf190 100755 --- a/app/Http/Controllers/GroupsController.php +++ b/app/Http/Controllers/GroupsController.php @@ -87,10 +87,15 @@ class GroupsController extends Controller public function edit($id = null) { $group = Group::find($id); - $permissions = config('permissions'); - $groupPermissions = $group->decodePermissions(); - $selected_array = Helper::selectedPermissionsArray($permissions, $groupPermissions); - return view('groups.edit', compact('group', 'permissions', 'selected_array', 'groupPermissions')); + + if ($group) { + $permissions = config('permissions'); + $groupPermissions = $group->decodePermissions(); + $selected_array = Helper::selectedPermissionsArray($permissions, $groupPermissions); + return view('groups.edit', compact('group', 'permissions', 'selected_array', 'groupPermissions')); + } + + return redirect()->route('groups.index')->with('error', trans('admin/groups/message.group_not_found', compact('id'))); } /** @@ -142,4 +147,24 @@ class GroupsController extends Controller return redirect()->route('groups.index')->with('error', trans('general.feature_disabled')); } + /** + * Returns a view that invokes the ajax tables which actually contains + * the content for the group detail page. + * + * @author [A. Gianotto] [] + * @param int $locationId + * @since [v4.0.11] + * @return \Illuminate\Contracts\View\View + */ + public function show($id) + { + $group = Group::find($id); + + if ($group) { + return view('groups/view', compact('group')); + } + + return redirect()->route('groups.index')->with('error', trans('admin/groups/message.group_not_found', compact('id'))); + } + } diff --git a/app/Models/User.php b/app/Models/User.php index cbe0a2b60..0639865a8 100755 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -378,6 +378,14 @@ class User extends SnipeModel implements AuthenticatableContract, CanResetPasswo return json_decode($this->permissions, true); } + + public function scopeByGroup($query, $id) { + return $query->whereHas('groups', function ($query) use ($id) { + $query->where('id', '=', $id); + }); + } + + /** * Query builder scope to search on text * diff --git a/resources/views/groups/index.blade.php b/resources/views/groups/index.blade.php index dc665ea71..140307a9a 100755 --- a/resources/views/groups/index.blade.php +++ b/resources/views/groups/index.blade.php @@ -31,7 +31,7 @@ {{ trans('general.id') }} - {{ trans('admin/groups/table.name') }} + {{ trans('admin/groups/table.name') }} {{ trans('admin/groups/table.users') }} {{ trans('general.created_at') }} {{ trans('table.actions') }} diff --git a/resources/views/groups/view.blade.php b/resources/views/groups/view.blade.php index 875d818ae..a4ce704c0 100644 --- a/resources/views/groups/view.blade.php +++ b/resources/views/groups/view.blade.php @@ -2,56 +2,63 @@ {{-- Page title --}} @section('title') -{{ trans('admin/groups/table.view') }} - -{{ $group->name }} -@parent + {{ $group->name }} + @parent @stop +@section('header_right') + {{ trans('admin/groups/titles.update') }} + {{ trans('general.back') }} +@stop + + + {{-- Page content --}} @section('content') -
-
- - {{ trans('admin/groups/table.update') }} - - - {{ trans('general.back') }} - -

{{ trans('admin/groups/titles.group_management') }} - {{ $group->name }}

-
-
+
+
+
+
+
+
+
+ + -
- - - - - - - @foreach ($users as $user) - - - - @endforeach - -
{{ trans('admin/groups/table.name') }}
- {{ $user->first_name }} {{ $user->last_name }} -
- - @else -
-
- - {{ trans('general.no_results') }} + +
+
+
- @endif
-
-
+
+ +
    + @foreach ($group->decodePermissions() as $permission_name => $permission) +
  • {!! ($permission == '1') ? '' : '' !!} {{ e(str_replace('.', ': ', ucwords($permission_name))) }}
  • + @endforeach + +
+ +
+
+ +@stop + +@section('moar_scripts') + @include ('partials.bootstrap-table', [ + 'exportFile' => 'groups-export', + 'search' => true, + 'columns' => \App\Presenters\UserPresenter::dataTableLayout() + ]) + @stop diff --git a/resources/views/partials/bootstrap-table.blade.php b/resources/views/partials/bootstrap-table.blade.php index e640d277a..896cb97ca 100644 --- a/resources/views/partials/bootstrap-table.blade.php +++ b/resources/views/partials/bootstrap-table.blade.php @@ -332,6 +332,21 @@ $('.snipe-table').bootstrapTable({ } } + function groupsFormatter(value) { + + if (value) { + var groups = ''; + for (var index in value.rows) { + groups += ' ' + value.rows[index].name + ' '; + } + return groups; + } + } + + function groupsAdminLinkFormatter(value, row) { + return ' ' + value + ''; + } + function trueFalseFormatter(value, row) { if ((value) && ((value == 'true') || (value == '1'))) { return ''; diff --git a/resources/views/users/index.blade.php b/resources/views/users/index.blade.php index 29a7d6bf0..1fcd3a10b 100755 --- a/resources/views/users/index.blade.php +++ b/resources/views/users/index.blade.php @@ -86,20 +86,5 @@ 'columns' => \App\Presenters\UserPresenter::dataTableLayout() ]) - @stop diff --git a/resources/views/users/view.blade.php b/resources/views/users/view.blade.php index 340d5e288..05389e4c3 100755 --- a/resources/views/users/view.blade.php +++ b/resources/views/users/view.blade.php @@ -536,7 +536,6 @@ $(function () { $('.progress-checkmark').fadeIn('fast').html(''); $.each(data.result.file, function (index, file) { $('' + file.notes + '<' + file.name + 'Just now' + file.filesize + ' Process').prependTo("#upload-table > tbody"); - //$('').text(file.name).appendTo(document.body); }); } $('#progress').removeClass('active'); diff --git a/routes/web.php b/routes/web.php index 31bda2239..bb78fa8a8 100644 --- a/routes/web.php +++ b/routes/web.php @@ -190,7 +190,10 @@ Route::group([ 'prefix' => 'admin','middleware' => ['authorize:superuser']], fun Route::get('requests', [ 'as' => 'requests', 'middleware' => 'authorize:admin', 'uses' => 'ViewAssetsController@getRequestedIndex']); - + Route::resource('groups', 'GroupsController', [ + 'middleware' => ['auth'], + 'parameters' => ['group' => 'group_id'] + ]); Route::get('/', ['as' => 'settings.index', 'uses' => 'SettingsController@index' ]); @@ -198,10 +201,7 @@ Route::group([ 'prefix' => 'admin','middleware' => ['authorize:superuser']], fun }); -Route::resource('groups', 'GroupsController', [ - 'middleware' => ['auth'], - 'parameters' => ['group' => 'group_id'] -]); + /* |-------------------------------------------------------------------------- From b80d3ce50dfee33e3ebf6eb361c08397b1e7e564 Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 18 Oct 2017 00:36:52 -0700 Subject: [PATCH 4/7] Hopefully fixes #4218 --- resources/views/account/requestable-assets.blade.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/resources/views/account/requestable-assets.blade.php b/resources/views/account/requestable-assets.blade.php index 6d492fad8..430570dd5 100644 --- a/resources/views/account/requestable-assets.blade.php +++ b/resources/views/account/requestable-assets.blade.php @@ -60,7 +60,9 @@ {{ $asset->serial }} - {!! $asset->assetLoc->present()->nameUrl() !!} + @if ($asset->assetloc) + {!! $asset->assetloc->present()->nameUrl() !!} + @endif @if ($asset->assigned_to != '' && $asset->assigned_to > 0) Checked out From 6bd49bfb72acc0c1c3cd4e241de83a55cce722d5 Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 18 Oct 2017 01:20:50 -0700 Subject: [PATCH 5/7] Fixes #4191 - user search --- app/Models/Asset.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/Models/Asset.php b/app/Models/Asset.php index d8df3f788..889396928 100644 --- a/app/Models/Asset.php +++ b/app/Models/Asset.php @@ -781,14 +781,11 @@ class Asset extends Depreciable $query->where('locations.name', 'LIKE', '%'.$search.'%'); }); })->orWhere(function ($query) use ($search) { - - $query->whereHas('assignedTo', function ($query) use ($search) { $query->where('users.first_name', 'LIKE', '%'.$search.'%') ->orWhere('users.last_name', 'LIKE', '%'.$search.'%') ->orWhere('users.username', 'LIKE', '%'.$search.'%') ->orWhere('locations.name', 'LIKE', '%'.$search.'%') ->orWhere('assigned_assets.name', 'LIKE', '%'.$search.'%'); - }); })->orWhere('assets.name', 'LIKE', '%'.$search.'%') ->orWhere('assets.asset_tag', 'LIKE', '%'.$search.'%') ->orWhere('assets.serial', 'LIKE', '%'.$search.'%') From ea63ced2bdfe947d3d2c68d46be1ceb806fece05 Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 18 Oct 2017 01:21:08 -0700 Subject: [PATCH 6/7] Fixes table alias bug in complex queries for Laravel --- app/Http/Controllers/Api/AssetsController.php | 47 ++++++++++--------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/app/Http/Controllers/Api/AssetsController.php b/app/Http/Controllers/Api/AssetsController.php index 8db3bea15..acc3eb022 100644 --- a/app/Http/Controllers/Api/AssetsController.php +++ b/app/Http/Controllers/Api/AssetsController.php @@ -146,39 +146,40 @@ class AssetsController extends Controller $assets->withTrashed()->Deleted(); break; case 'Pending': - $assets->join('status_labels',function ($join) { - $join->on('status_labels.id', "=", "assets.status_id") - ->where('status_labels.deployable','=',0) - ->where('status_labels.pending','=',1) - ->where('status_labels.archived', '=', 0); + $assets->join('status_labels AS status_alias',function ($join) { + $join->on('status_alias.id', "=", "assets.status_id") + ->where('status_alias.deployable','=',0) + ->where('status_alias.pending','=',1) + ->where('status_alias.archived', '=', 0); }); break; case 'RTD': - $assets->join('status_labels',function ($join) { - $join->on('status_labels.id', "=", "assets.status_id") - ->where('status_labels.deployable','=',1) - ->where('status_labels.pending','=',0) - ->where('status_labels.archived', '=', 0); + $assets->whereNull('assets.assigned_to') + ->join('status_labels AS status_alias',function ($join) { + $join->on('status_alias.id', "=", "assets.status_id") + ->where('status_alias.deployable','=',1) + ->where('status_alias.pending','=',0) + ->where('status_alias.archived', '=', 0); }); break; case 'Undeployable': $assets->Undeployable(); break; case 'Archived': - $assets->join('status_labels',function ($join) { - $join->on('status_labels.id', "=", "assets.status_id") - ->where('status_labels.deployable','=',0) - ->where('status_labels.pending','=',0) - ->where('status_labels.archived', '=', 1); + $assets->join('status_labels AS status_alias',function ($join) { + $join->on('status_alias.id', "=", "assets.status_id") + ->where('status_alias.deployable','=',0) + ->where('status_alias.pending','=',0) + ->where('status_alias.archived', '=', 1); }); break; case 'Requestable': $assets->where('assets.requestable', '=', 1) - ->join('status_labels',function ($join) { - $join->on('status_labels.id', "=", "assets.status_id") - ->where('status_labels.deployable','=',1) - ->where('status_labels.pending','=',0) - ->where('status_labels.archived', '=', 0); + ->join('status_labels AS status_alias',function ($join) { + $join->on('status_alias.id', "=", "assets.status_id") + ->where('status_alias.deployable','=',1) + ->where('status_alias.pending','=',0) + ->where('status_alias.archived', '=', 0); }); break; @@ -188,9 +189,9 @@ class AssetsController extends Controller break; default: // terrible workaround for complex-query Laravel bug in fulltext - $assets->join('status_labels',function ($join) { - $join->on('status_labels.id', "=", "assets.status_id") - ->where('status_labels.archived', '=', 0); + $assets->join('status_labels AS status_alias',function ($join) { + $join->on('status_alias.id', "=", "assets.status_id") + ->where('status_alias.archived', '=', 0); }); } From ab3f5f4f4ddc8b344174d416ab01b5a7d2c1c61b Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 18 Oct 2017 01:21:50 -0700 Subject: [PATCH 7/7] Bumped version --- config/version.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/config/version.php b/config/version.php index beabd58f8..fb7ce45b1 100644 --- a/config/version.php +++ b/config/version.php @@ -1,7 +1,7 @@ 'v4.0.11', - 'build_version' => '264', - 'hash_version' => 'gc776fa4', - 'full_hash' => 'v4.0.11-264-gc776fa4', + 'app_version' => 'v4.0.12', + 'build_version' => '272', + 'hash_version' => 'gea63ced', + 'full_hash' => 'v4.0.12-272-gea63ced', );